Matplotlib 基础

Matplotlib

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券