«Это 19-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г."
Адрес электронной книги:GitHub.com/корица i2/последняя…
Рекомендуемая технология с открытым исходным кодом для объяснения книги matplotlib: «научная-визуализация-книга». В основном это объясняет введение и основные принципы библиотеки Matplotlib, графический дизайн, графическую компоновку и организацию, 3D-графику и анимацию и т. д.
содержание
anatomy of figure
Как показано на изображении выше, рисунок matplotlib состоит из иерархии нескольких элементов, которые объединяются для формирования фактического рисунка, и важно понимать различные элементы рисунка.
элемент
Важнейшим элементом фигуры является сама фигура. Он создается при вызове метода figure, и мы видели, что вы можете указать его размер, а также цвет фона (facecolor) и заголовок (suptitle). Важно знать, что цвет фона при сохранении рисунка не используется, т.к.savefigФункция также имеет параметр цвета лица (по умолчанию белый), который переопределяет цвет фона фигуры. Если вам не нужен какой-либо фон, вы можете указать его при сохранении рисунка.transparent=True
.
Оси — второй по важности элемент, соответствующий фактической области рендеринга данных. это также называетсяsubplot. Каждый график может иметь одну или несколько осей, и каждая ось обычно называетсяspinesс четырех сторон (слева, сверху, справа и снизу). ЭтиspinesКаждый из них может быть использованmajor ticksиminor ticks(внутренний или внешний соответственно),tick labelsиlabelукрашать.
Эти украшенные шипы называются топорами. Горизонтальное направление — это ось X, а вертикальное направление — это ось Y. каждый поspine,major ticksиminor ticks, метки основных и второстепенных делений и метки осей.
Шейки — это линии, соединяющие деления осей и обозначающие границы области данных. Их можно разместить где угодно, видимыми или невидимыми.
Все на графике, включая графики, оси и объекты осей,artist. Включая текстовые объекты, объекты Line2D, объекты-коллекции и объекты-заплатки. При рендеринге символов всеartistнарисованы на холсте. данныйartistТолько по одной оси.
оказывать
Также автор дает подробные настройки рендеринга matplotlib.
import matplotlib
matplotlib.use("xxx")
Размеры и разрешение
fig = plt.figure(figsize=(6,6))
plt.savefig("output.png")
matplotlib默认dpi为100
, что соответствует разрешению 6 дюймов на 6 дюймов. Для научной статьи издателям обычно требуются цифры от 300 до 600 dpi. Чтобы настройка dpi была правильной, нам нужно знать, каковы физические размеры графики, вставляемой в документ.
Автор приводит более конкретный пример, будем считать, что формат книги А5 (148 х 210 мм). Левое и правое поля составляют по 20 мм каждое, а изображения обычно отображаются с использованием полной ширины текста. Это означает, что физическая ширина изображения составляет ровно 108 мм или около 4,25 дюйма. Если мы используем рекомендуемые 600 dpi, мы получим ширину 2550 пикселей, что, вероятно, превышает разрешение экрана и, следовательно, менее удобно. Вместо этого мы можем использовать матплотлиб dpi по умолчанию (100), когда мы отображаем фигуру на экране, и только при сохранении фигуры мы используем другое и более высокое dpi:
def figure(dpi):
fig = plt.figure(figsize=(4.25,.2))
ax = plt.subplot(1,1,1)
text = "Text rendered at 10pt using %d dpi" % dpi
ax.text(0.5, 0.5, text, ha="center", va="center",
fontname="Source Serif Pro",
fontsize=10, fontweight="light")
plt.savefig("figure-dpi-%03d.png" % dpi, dpi=dpi)
figure(50), figure(100), figure(300), figure(600)
Авторы предоставляют множество полезных графических упражнений для исследований.
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
def curve():
n = np.random.randint(1,5)
centers = np.random.normal(0.0,1.0,n)
widths = np.random.uniform(5.0,50.0,n)
widths = 10*widths/widths.sum()
scales = np.random.uniform(0.1,1.0,n)
scales /= scales.sum()
X = np.zeros(500)
x = np.linspace(-3,3,len(X))
for center, width, scale in zip(centers, widths, scales):
X = X + scale*np.exp(- (x-center)*(x-center)*width)
return X
np.random.seed(123)
cmap = mpl.cm.get_cmap("Spectral")
fig = plt.figure(figsize=(8, 8))
ax = None
for n in range(3):
ax = plt.subplot(1, 3, n + 1, frameon=False, sharex=ax)
for i in range(50):
Y = curve()
X = np.linspace(-3, 3, len(Y))
ax.plot(X, 3 * Y + i, color="k", linewidth=0.75, zorder=100 - i)
color = cmap(i / 50)
ax.fill_between(X, 3 * Y + i, i, color=color, zorder=100 - i)
# Some random text on the right of the curve
v = np.random.uniform(0, 1)
if v < 0.4:
text = "*"
if v < 0.05:
text = "***"
elif v < 0.2:
text = "**"
ax.text(
3.0,
i,
text,
ha="right",
va="baseline",
size=8,
transform=ax.transData,
zorder=300,
)
ax.yaxis.set_tick_params(tick1On=False)
ax.set_xlim(-3, 3)
ax.set_ylim(-1, 53)
ax.axvline(0.0, ls="--", lw=0.75, color="black", zorder=250)
ax.text(
0.0,
1.0,
"Value %d" % (n + 1),
ha="left",
va="top",
weight="bold",
transform=ax.transAxes,
)
if n == 0:
ax.yaxis.set_tick_params(labelleft=True)
ax.set_yticks(np.arange(50))
ax.set_yticklabels(["Serie %d" % i for i in range(1, 51)])
for tick in ax.yaxis.get_major_ticks():
tick.label.set_fontsize(6)
tick.label.set_verticalalignment("bottom")
else:
ax.yaxis.set_tick_params(labelleft=False)
plt.tight_layout()
plt.savefig("./zorder-plots.png", dpi=600)
plt.savefig("./zorder-plots.pdf")
plt.show()
Использованная литература:
[1] Nicolas Rougier. Scientific Visualization: Python + Matplotlib. Nicolas P. Rougier. 2021, 978-2- 9579901-0-8. hal-03427242