Научная графика в Python

Автор: Шабанов Павел Александрович

E-mail: [email protected]

URL: Заметки по программированию в науках о Земле

Дата последнего обновления: 11.03.2017

In [12]:
# Преамбула
%matplotlib inline

import os
import matplotlib.pyplot as plt
import numpy as np

def save(name='', fmt='png'):
    pwd = os.getcwd()
    iPath = './pictures/{}'.format(fmt)
    if not os.path.exists(iPath):
        os.mkdir(iPath)
    os.chdir(iPath)
    plt.savefig('{}.{}'.format(name, fmt), fmt='png')
    os.chdir(pwd)
    #plt.close()

Глава 2 Основные графические команды

Содержание главы

  1. Графические команды;

  2. Диаграммы;

  3. Методы изолиний;

  4. Методы заливки;

  5. Векторные диаграммы.

Графические команды - это функции, которые, принимая некоторые параметры, возвращают какой-то графический результат. Это может быть текст, линия, график, диаграмма и др. В этой главе будут рассмотрены графические команды, которые создают графику высокого уровня: графики или диаграммы. Подробнее о конкретных типах графиков смотри в электронных ресурсах.

Электронные ресурсы:

2.1 Графические команды

В Matplotlib заложены как простые графические команды, так и достаточно сложные. Доступ к ним через pyplot означает использование синтаксиса вида "plt.название_команды()".

Наиболее распространённые команды для создания научной графики в matplotlib это:

I. Самые простые графические команды:

  • plt.scatter() - маркер или точечное рисование;

  • plt.plot() - ломаная линия;

  • plt.text() - нанесение текста;

II. Диаграммы:

  • plt.bar(), plt.barh(), plt.barbs(), broken_barh() - столбчатая диаграмма;

  • plt.hist(), plt.hist2d(), plt.hlines - гистограмма;

  • plt.pie() - круговая диаграмма;

  • plt.boxplot() - "ящик с усами" (boxwhisker);

  • plt.errorbar() - оценка погрешности, "усы".

III. Изображения в изолиниях:

  • plt.contour() - изолинии;

  • plt.contourf() - изолинии с послойной окраской;

IV. Отображения:

  • plt.pcolor(), plt.pcolormesh() - псевдоцветное изображение матрицы (2D массива);

  • plt.imshow() - вставка графики (пиксели + сглаживание);

  • plt.matshow() - отображение данных в виде квадратов.

V. Заливка:

  • plt.fill() - заливка многоугольника;

  • plt.fill_between(), plt.fill_betweenx() - заливка между двумя линиями;

VI. Векторные диаграммы:

  • plt.streamplot() - линии тока;

  • plt.quiver() - векторное поле.

Полный список команд, доступный для pyplot, можно узнать на официальном сайте matplotlib. В списке нет команд для рисования различных геометрических фигур (круги, многоугольники и т.д.). Это связано с тем, что в matplotlib они вызываются через matplotlib.patches, который за них отвечает. Создание геометрически сложных фигур является достаточно специальной задачей, поэтому matplotlib.patches здесь не будут рассматриваться.

Ознакомиться с примерами создания фигур с помощью matplotlib можно в электронных ресурсах к этой главе.

Ниже показаны примеры графики, которую matplotlib создаёт "по умолчанию" при вызове той или иной графической команды. В дальнейшем будет показано как задать ту или иную конфигурацию конкретного графика и как настроить сопутствующие рисунку элементы (подписи, линии вспомогательной сетки, шрифты и т.д.).

In [13]:
# Пример 2.1 

import matplotlib.pyplot as plt

fig = plt.figure()
# Добавление на рисунок прямоугольной (по умолчанию) области рисования
scatter1 = plt.scatter(0.0, 1.0)
print('Scatter: ', type(scatter1))

graph1 = plt.plot([-1.0, 1.0], [0.0, 1.0])
print('Plot: ', len(graph1), graph1)

text1 = plt.text(0.5, 0.5, 'Text on figure')
print('Text: ', type(text1))

grid1 = plt.grid(True)   # линии вспомогательной сетки

save(name='pic_2_1', fmt='pdf')
save(name='pic_2_1', fmt='png')

plt.show()
('Scatter: ', <class 'matplotlib.collections.PathCollection'>)
('Plot: ', 1, [<matplotlib.lines.Line2D object at 0x0000000009CD3C50>])
('Text: ', <class 'matplotlib.text.Text'>)

2.2 Диаграммы

In [14]:
# Пример 2.2

import matplotlib.pyplot as plt
import numpy as np

s = ['one','two','three ','four' ,'five']
x = [1, 2, 3, 4, 5]
z = np.random.random(100)
z1 = [10, 17, 24, 16, 22]
z2 = [12, 14, 21, 13, 17]

# bar()
fig = plt.figure()
plt.bar(x, z1)
plt.title('Simple bar chart')
plt.grid(True)   # линии вспомогательной сетки

# hist()
fig = plt.figure()
plt.hist(z)
plt.title('Simple histogramm')
plt.grid(True)

# pie()
fig = plt.figure()
plt.pie(x, labels=s)
plt.title('Simple pie chart')

# boxplot()
fig = plt.figure()
plt.boxplot([z1, z2])
plt.title('Simple box whisker chart')
plt.grid(True)

# errorbar()
fig = plt.figure()
plt.errorbar(x, z1, xerr=1, yerr=0.5)
plt.title('Simple error bar chart')
plt.grid(True)

# смотри преамбулу
save(name='pic_2_2', fmt='pdf')
save(name='pic_2_2', fmt='png')

plt.show()

2.3 Методы изолиний

In [15]:
# Пример 2.3

import matplotlib.pyplot as plt
import numpy as np

dat = np.random.random(200).reshape(20,10) # создаём матрицу значений

fig = plt.figure()
pc = plt.pcolor(dat) # метод псевдографики pcolor
plt.colorbar(pc)
plt.title('Simple pcolor plot')

fig = plt.figure()
me = plt.imshow(dat) 
plt.colorbar(me)
plt.title('Simple imshow plot')

save(name='pic_2_3', fmt='pdf')
save(name='pic_2_3', fmt='png')

plt.show()

2.4 Методы отображений

In [16]:
# Пример 2.4

import matplotlib.pyplot as plt
import numpy as np

dat = np.random.random(200).reshape(20,10) # создаём матрицу значений

fig = plt.figure()
cr = plt.contour(dat) 
plt.colorbar(cr)
plt.title('Simple contour plot')

fig = plt.figure()
cf = plt.contourf(dat) 
plt.colorbar(cf)
plt.title('Simple contourf plot')

fig = plt.figure()
cf = plt.matshow(dat) 
plt.colorbar(cf, shrink=0.7)
plt.title('Simple matshow plot')

save(name='pic_2_4', fmt='pdf')
save(name='pic_2_4', fmt='png')

plt.show()
<matplotlib.figure.Figure at 0x9201240>

2.5 Методы заливки

In [17]:
# Пример 2.5

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0, 4*np.pi+0.1, 0.1)
y = np.sin(x)
z = np.sin(2*x)

x2 = np.arange(20)
y2 = -1.5*x2 + 2.33
z2 = 0.7*x2 - 8.5 

# fill()
fig = plt.figure()
plt.fill(x, y, 'r') # метод псевдографики pcolor
plt.title('Simple fill')
plt.grid(True)

# fill_between()
fig = plt.figure()
plt.plot(x2, z2, color='pink', linewidth=4.0)
plt.plot(x2, y2, color='g', linewidth=4.0)
plt.fill_between(x2, y2, z2) 
plt.title('Simple fill_between')
plt.grid(True)

# fill_betweenx()
fig = plt.figure()
plt.plot(z, x, color='pink', linewidth=4.0)
plt.plot(z, x-1.0, color='g', linewidth=4.0)
plt.fill_betweenx(z, x, x-1.0, color='cyan')
plt.title('Simple fill_betweenx')
plt.grid(True)

save(name='pic_2_5', fmt='pdf')
save(name='pic_2_5', fmt='png')

plt.show()

2.6 Векторные диаграммы

In [18]:
# Пример 2.6

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-2*np.pi, 2*np.pi, 0.1)
u = np.sin(x)*np.cos(x)
v = np.cos(x)
uu, vv = np.meshgrid(u,v)

N = 100
x1 = np.random.random(N).reshape((10, 10))
y1 = np.random.random(N).reshape((10, 10))

# streamplot()
fig = plt.figure()
plt.streamplot(x, x, uu, vv) 
plt.title('Simple stream plot')
plt.grid(True)

# quiver()
fig = plt.figure()
plt.quiver(x1, y1, color='green') 
plt.title('Simple quiver plot')
plt.grid(True)

save(name='pic_2_6', fmt='pdf')
save(name='pic_2_6', fmt='png')

plt.show()
In [ ]: