Раздел «Язык Си».PythonGraphsTerms:

Термины

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")

1a.png

Термины

Описание линий и маркеров

Синяя линия шириной 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')