Термины
Figure (рисунок), axes (оси)
fig, ax - это описание рисунка (figure) и осей (axes).
axis - ось (1), axes - оси (много).
Axes определяет область, где будем рисовать.
Figure имеет координаты (0,0) в левом нижнем углу и (1,1) в правом верхнем углу. Оси можно сделать не на весь рисунок, а на часть и добавить подписи.
figsize=(8, 2.5) определяет размер и масштаб рисунка.
fig.savefig("1a.png", dpi=100, facecolor="#f1f1f1") - сохранить в файл 1a.png с разрешением 100 dpi (значит, при figsize=(8, 2.5) рисунок будет 8*100=800 на 2.5*100=250 pixel).
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(8, 2.5), facecolor="#f1f1f1")
# axes coordinates as fractions of the canvas width and height
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8 # задаем значения переменных
ax = fig.add_axes((left, bottom, width, height), axisbg="#e1e1e1")
x = np.linspace(-2, 2, 1000)
y1 = np.cos(40 * x)
y2 = np.exp(-x**2)
ax.plot(x, y1 * y2)
ax.plot(x, y2, 'g')
ax.plot(x, -y2, 'g')
ax.set_xlabel("x")
ax.set_ylabel("y")
plt.show()
fig.savefig("1a.png", dpi=100, facecolor="#f1f1f1")
Термины
Описание линий и маркеров
Синяя линия шириной 3 пикселя, линия как ---- и точки отмечены треугольниками.
ax.plot(x, y, color='b', linewidth=3, linestyle='--', markerstyle='v')
Legend (описание)
ax.legend(ncol=4, loc=3, bbox_to_anchor=(0, 1))
Axis labels and titles (надписи у осей и заголовки)
ax.set_xlabel("x", labelpad=5, fontsize=18, fontname='serif', color="blue")
ax.set_ylabel("f(x)", labelpad=15, fontsize=18, fontname='serif', color="blue")
ax.set_title("axis labels and title example", fontsize=16,
fontname='serif', color="blue")
Подключить русские буквы (не-латинские буквы, иероглифы)
Если вы хотите, чтобы надписи были на русском, а вместо них показываются непонятные символы, то, вероятно, у вас выбран фонт без поддержки нужных букв.
Можно в каждом вызове set_title и set_xlabel, set_ylabel указывать фонт явно, а можно указать нужный фонт в начале программы.
Один раз указываем фонт:
from matplotlib import rc
font = {'family': 'verdana', # вот это название шрифта, если у вас другой шрифт для нужных букв, пишите правильное имя шрифта
'weight': 'normal',
# 'size': 14 можно указать еще размер символов в points
}
rc('font', **font)
Потом его используем
много раз в разных графиках (в функциях оставлены только обязательные параметры).
ax.set_xlabel("x")
ax.set_ylabel("f(x)")
ax.set_title("axis labels and title example")
Axis range (диапазоны осей)
ax.set_xlim(-5, 35)
ax.set_ylim(-1, 1)
ax.axis('tight')
ax.axis('equal')
Axis ticks, tick labels
ax1.set_xticks([-5, 0, 5])
ax1.set_yticks([-1, 0, 1])
ax2.xaxis.set_major_locator(mpl.ticker.MaxNLocator(4))
ax2.yaxis.set_major_locator(mpl.ticker.FixedLocator([-1, 0, 1]))
ax2.xaxis.set_minor_locator(mpl.ticker.MaxNLocator(8))
ax2.yaxis.set_minor_locator(mpl.ticker.MaxNLocator(8))
ax3.set_xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi])
ax3.set_xticklabels(['$-2\pi$', '$-\pi$', 0, r'$\pi$', r'$2\pi$'])
Поставить ticks, подписать около них labels, вариант через plt (а не оси).
plt.xticks([-2 * np.pi, -np.pi, 0, np.pi, 2 * np.pi], ['$-2\pi$', '$-\pi$', 0, r'$\pi$', r'$2\pi$'])
Grid (решетка)
axes[0].set_title("default grid")
axes[0].grid()
axes[1].set_title("major/minor grid")
axes[1].grid(color="blue", which="both", linestyle=':', linewidth=0.5)
axes[2].set_title("individual x/y major/minor grid")
axes[2].grid(color="grey", which="major", axis='x', linestyle='-', linewidth=0.5)
axes[2].grid(color="grey", which="minor", axis='x', linestyle=':', linewidth=0.25)
axes[2].grid(color="grey", which="major", axis='y', linestyle='-', linewidth=0.5)
Логарифмическая шкала
Для всего рисунка
plt.xscale('log')
plt.yscale('log')
Для одного графика (другие графики на рисунке могут иметь обычную шкалу)
ax.set_xscale('log')
ax.set_yscale('log')
Разные шкалы оси Y для разных графиков (twinx)
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
fig, ax1 = plt.subplots(figsize=(8, 4))
r = np.linspace(0, 5, 100)
a = 4 * np.pi * r ** 2 # area
v = (4 * np.pi / 3) * r ** 3 # volume
ax1.set_title("surface area and volume of a sphere", fontsize=16)
ax1.set_xlabel("radius [m]", fontsize=16)
ax1.plot(r, a, lw=2, color="blue")
ax1.set_ylabel(r"surface area ($m^2$)", fontsize=16, color="blue")
for label in ax1.get_yticklabels():
label.set_color("blue")
ax2 = ax1.twinx()
ax2.plot(r, v, lw=2, color="red")
ax2.set_ylabel(r"volume ($m^3$)", fontsize=16, color="red")
for label in ax2.get_yticklabels():
label.set_color("red")
plt.show()
fig.savefig('twinx.png')