Форум сайта python.su
Привет.
Формирую график таким кодом:
font = {"family" : "monospace", "size" : 12} plt.rc("font", **font) fig, ax1 = plt.subplots() ax1.grid(ls="-", lw=.7) ax1.tick_params(axis="both", labelsize=12) ax1.set_xlabel("Date") plt.setp(ax1.get_xticklabels(), rotation=90) ax2 = ax1.twinx() ax1.plot(date, p1, color='red', label="Param1") ax2.plot(date, p2, color='blue', label="Param2", linestyle='--') ax2.axhspan(29, 40, color='gray', alpha=0.4) ax1.legend(loc="upper left", fontsize=10, ncol=1) ax2.legend(loc="upper right", fontsize=10, ncol=1) plt.savefig(plot_file, dpi=300, bbox_inches="tight") plt.show()
Отредактировано Yyy (Сен. 12, 2021 01:41:36)
Прикреплённый файлы:
saved.png (175,8 KБ)
Офлайн
YyyНажимать кнопку сохранения картинки в окошке которое вы показали.
как получить при сохранении 1 к 1 то, что показало plt.show()?
figure(figsize=(8, 6), dpi=80)
YyyЛегенды очевидно не пересекутся если у вас одна легенда.
в итоге получаю наложение легенды одного графика на легенду другого графика.
... lns1 = ax.plot(time, Swdown, '-', label = 'Swdown') lns2 = ax.plot(time, Rn, '-', label = 'Rn') ax2 = ax.twinx() lns3 = ax2.plot(time, temp, '-r', label = 'temp') # added these three lines lns = lns1+lns2+lns3 labs = [l.get_label() for l in lns] ax.legend(lns, labs)
Офлайн
doza_andВариант, конечно, но не продуктивный. В моем случае графики должны строиться автоматически, потому что их для одного набора данных несколько десятков, а набор данных периодически пополняется.
Нажимать кнопку сохранения картинки в окошке которое вы показали.
doza_andЯ пытался это сделать через figure в моем варианте, где я создаю подграфики с помощью plt.subplots(). Сейчас еще раз перечитал документацию и сделал через add_subplot.
У вас разный размер фигуры. Сделайте нужный вам меняя figsize.
plt.rcParams["font.size"] = "8" fig = plt.figure(figsize=(19.20, 10.80), dpi=86) a1 = fig.add_subplot() a1.plot(date, p1, color='red', label="Param1") a1.grid(ls="-", lw=.7) a1.tick_params(axis="both") a1.set_xlabel("Date") a2 = a1.twinx() a2.plot(date, p2, color='blue', label="Param2", linestyle='--') fig.legend(labels=("P1", "P2"), loc="upper left") plt.setp(a1.get_xticklabels(), rotation=90) a2.axhspan(29, 40, color='gray', alpha=0.4) plt.savefig(plot_file) plt.show()
Отредактировано Yyy (Сен. 12, 2021 10:57:57)
Офлайн
YyyСтранно что не наблюдаете. Вообще если не пичкать лишними опциями matplotlib то все из коробки отлично работает с прореживанием надписей на осях. Ну может есть проблемы с datetime?
Пока не наблюдаю этого. Буду копать в документации или пытаться привязать
Офлайн
doza_andФайл с данными - https://dropmefiles.com/ydTKa
удет конструктивнее если выложите данные и скрипт. Тогда можно будет понять что у вас там лишнее.
#!/usr/bin/env python3 import csv from matplotlib import pyplot as plt # Plots date = [] p1 = [] p2 = [] src_file = '1.csv' with open(src_file, 'r') as f: reader = csv.reader(f, delimiter=';', quotechar='\'') for line in reader: month = int(line[0]) if month in range(6,9): date.append("2021-{}-{}".format(line[0].zfill(2), line[1].zfill(2))) p1.append(int(line[3])) p2.append(int(line[2])) plot_file = "plot-6-8.png" fig = plt.figure(figsize=(19.20, 10.80), dpi=100) plt.rcParams = {"font.size" : 12, "font.family" : "monospace"} a1 = fig.add_subplot() a1.plot(date, p1, color='red') a1.grid(ls="-", lw=.7) a1.tick_params(axis="both", length=10, pad=5) a1.set_xlabel("Date") a2 = a1.twinx() a2.plot(date, p2, color='blue', linestyle='--') fig.legend(labels=("P1", "P2"), loc="upper left") plt.setp(a1.get_xticklabels(), rotation=90) for label in a1.get_xaxis().get_ticklabels()[1::2]: label.set_visible(False) plt.savefig(plot_file) plt.show()
Отредактировано Yyy (Сен. 12, 2021 16:19:23)
Прикреплённый файлы:
plot-6-8-с-объяснением.png (172,2 KБ)
Офлайн