Matplotlib 是一个 Python 绘图库,可以跨平台生成各种硬拷贝格式和交互式环境的出版品质数据。
Matplotlib绘图解剖(Plot Anatomy)
Plot工作流程(Workflow)
使用 matplotlib 创建绘图的基本步骤
import matplotlib.pyplot as plt
# 1. 准备数据
x = [1, 2, 3, 4]
y = [10, 20, 25, 30]
# 2. 创建绘图
fig = plt.figure()
# 3. 绘图
ax = fig.add_subplot(111)
# 4. 自定义绘图
ax.plot(x, y, color='lightblue', linewidth=3)
ax.scatter([2, 4, 6],
[5, 15, 25],
color='darkgreen',
marker='^')
ax.set_xlim(1, 6.5)
# 5. 保存图
plt.savefig('foo.png')
# 6. 显示图
plt.show()
准备数据
1D数据
import numpy as np
x = np.linspace(0, 10, 100)
y = np.cos(x)
z = np.sin(x)
2D数据 或 图像
from matplotlib.cbook import get_sample_data
import os
data = 2 * np.random.random((10, 10))
data2 = 3 * np.random.random((10, 10))
Y, X = np.mgrid[-3:3:100j, -3:3:100j]
U = -1 - X**2 + Y
V = 1 + X - Y**2
img = np.load(get_sample_data(os.getcwd() + '/axes_grid/bivariate_normal.npy'))
创建图
import matplotlib.pyplot as plt
# 魔法函数(Magic Functions)功能是可以内嵌绘图,并且可以省略掉 plt.show()
%matplotlib inline
图形(Figure)
fig = plt.figure()
fig2 = plt.figure(figsize=plt.figaspect(2.0))
轴(Axes)
所有绘图都是针对 Axes 完成的。 在大多数情况下,子图符合您的需求。子图是网格系统上的轴。
fig.add_axes()
ax1 = fig.add_subplot(221) # 行-列-数字
ax3 = fig.add_subplot(212)
fig3, axes = plt.subplots(nrows=2, ncols=2)
output_24_0.png
fig4, axes2 = plt.subplots(ncols=3)
output_25_0.png
常规绘制
1D 数据
fig, ax = plt.subplots()
# 用连接它们的线或标记绘制点
lines = ax.plot(x, y)
# 绘制未连接的点,缩放或着色
ax.scatter(x, y)
# 绘制垂直矩形(恒定宽度)
axes[0, 0].bar([1, 2, 3], [3, 4, 5])
# 绘制horiontal矩形(恒定高度)
axes[1, 0].barh([0.5, 1, 2.5], [0, 1, 2])
# 在轴上绘制一条水平线
axes[1, 1].axhline(0.45)
# 在轴上绘制一条垂直线
axes[0, 1].axvline(0.65)
# 绘制填充的多边形
ax.fill(x, y, color='blue')
# 在 y 值和 0 之间填充
ax.fill_between(x, y, color='yellow')
output_28_1.png
2D数据 或 图像
fig, ax = plt.subplots()
# 彩色贴图或 RGB 数组
im = ax.imshow(img,
cmap='gist_earth',
interpolation='nearest',
vmin=-2,
vmax=2)
output_30_0.png
# 二维数组的伪彩色图
axes2[0].pcolor(data2)
# 二维数组的伪彩色图
axes2[0].pcolormesh(data)
# 绘制轮廓
CS = plt.contour(Y, X, U)
# 绘制填充轮廓
axes2[2].contourf(data)
# 标记等高线图
axes2[2] = ax.clabel(CS)
output_31_0.png
向量字段
# 向轴添加箭头
axes[0, 1].arrow(0, 0, 0.5, 0.5)
# 绘制箭头的 2D 字段
axes[1, 1].quiver(y, z)
# 绘制箭头的 2D 字段
axes[0, 1].streamplot(X, Y, U, V)
数据分布
# 绘制直方图
ax1.hist(y)
# 制作一个箱图
ax3.boxplot(y)
# 制作小提琴图
ax3.violinplot(z)
自定义绘图
颜色,彩条(Color bars)和彩图(Color maps)
plt.plot(x, x, x, x**2, x, x**3)
ax.plot(x, y, alpha=0.4)
ax.plot(x, y, c='k')
fig.colorbar(im, orientation='horizontal')
im = ax.imshow(img, cmap='seismic')
output_38_0.png
标记
fig, ax = plt.subplots()
ax.scatter(x, y, marker=".")
ax.plot(x, y, marker="o")
output_40_1.png
线条样式
plt.plot(x, y, linewidth=4.0)
output_42_1.png
plt.plot(x, y, ls='solid')
output_43_1.png
plt.plot(x, y, ls='--')
output_44_1.png
plt.plot(x, y, '--', x**2, y**2, '-.')
output_45_1.png
plt.setp(lines, color='r', linewidth=4.0)
文字 & 注释
ax.text(1,
-2.1,
'Example Graph',
style='italic')
ax.annotate("Sine",
xy=(8, 0),
xycoords='data',
xytext=(10.5, 0),
textcoords='data',
arrowprops=dict(arrowstyle="->",
connectionstyle="arc3"),)
数学
plt.title(r'$sigma_i=15$', fontsize=20)
output_51_1.png
限制,图例 & 布局(Limits, Legends & Layouts)
限制 & 自动缩放(Limits & Autoscaling)
ax.margins(x=0.0, y=0.1)
ax.axis('equal')
ax.set(xlim=[0, 10.5], ylim=[-1.5, 1.5])
ax.set_xlim(0, 10.5)
图例
# 设置标题和x轴和y轴标签
ax.set(title='An Example Axes',
ylabel='Y-Axis',
xlabel='X-Axis')
# 不重叠的图元素
ax.legend(loc='best', labels='No overlapping plot elements')
刻度(Ticks)
# 手动设置 x-ticks
ax.xaxis.set(ticks=range(1,5),
ticklabels=[3,100,-12,"foo"])
# y-ticks 变长
ax.tick_params(axis='y',
direction='inout',
length=10)
子图间距
# 调整子图之间的间距
fig3.subplots_adjust(wspace=0.5,
hspace=0.3,
left=0.125,
right=0.9,
top=0.9,
bottom=0.1)
# 子图适配图区域
fig.tight_layout()
坐标轴(Axis Spines)
# 向下移动底部轴线
ax1.spines['top'].set_visible(False)
# 使图的顶轴不可见
ax1.spines['bottom'].set_position(('outward', 10))
保存图
保存图片(Save figures)
plt.savefig('bar.png')
保存透明图(Save transparent figures)
plt.savefig('bar_trans.png', transparent=True)
显示图
plt.show()
关闭 & 清除
# 清除轴
plt.cla()
# 清除整个图
plt.clf()
# 关闭一个窗口
plt.close()
示例
折线图(Line plot)
import matplotlib.pyplot as plt
import numpy as np
a = np.linspace(0, 10, 100)
b = np.exp(-a)
plt.plot(a, b)
plt.show()
output_80_0.png
直方图( Histogram)
import matplotlib.pyplot as plt
from numpy.random import normal,rand
x = normal(size=200)
plt.hist(x, bins=30)
plt.show()
output_82_0.png
散点图(Scatter plot)
import matplotlib.pyplot as plt
from numpy.random import rand
a = rand(100)
b = rand(100)
plt.scatter(a, b)
plt.show()
output_84_0.png
3D 图(3D plot)
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm)
plt.show()
output_86_0.png
网友评论