# 一、一些常用图形

   matplotlib 可支持的绘图类型可以参考官方文档:https://matplotlib.org/stable/plot_types/index.html

# 1.1 plot - 绘制折线图(曲线图)

  使用 plt.plot() 函数可以绘制折线图, plot() 函数的原型为 plt.plot(x, y, format_string, **kwargs) ,其中,仓用参数的解释如下:

  • x:x 轴数据,列表或数组,可选
  • y:y 轴数据,列表或数组
  • format_string:控制曲线的格式字符串,可选,由颜色字符、风格字符和标记字符组成(等同于 color、marker 和 linestyle 的结合)。
    使用案例如下:
import matplotlib.pyplot as plt
import numpy as np
# evenly sampled time at 200ms intervals
t = np.arange(0., 5., 0.2)
# red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()

  绘制的图形如下图所示:

# 1.2 scatter - 绘制散点图

  使用 plt.scatter() 函数可以绘制散点图, scatter() 函数的原型为 scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs) ,其中,一些常用参数的解释如下:

  • x, y # 散点的坐标,float or array-like, shape (n,)
  • s # 散点的面积,float or array-like, shape (n,), optional
  • c # 散点的颜色(默认值为蓝色,‘b’,其余颜色可参考 2.1)
  • marker # 散点样式(默认值为实心圆,‘o’,其余样式可参考 2.1)
  • alpha # 散点透明度([0, 1] 之间的数,0 表示完全透明,1 则表示完全不透明)
  • linewidths # 散点的边缘线宽
  • edgecolors # 散点的边缘颜色
    使用案例如下:
import matplotlib.pyplot as plt
import numpy as np
n = 20  # 生成 20 个点
x = np.random.rand(n)
y = np.random.rand(n)
plt.scatter(x, y, s=100, c='r', marker='*', alpha=0.3)
plt.show()

  绘制的图形如下所示:

# 二、一些常用操作

# 2.1 更改曲线样式

  在绘制曲线图以及散点图时,可以通过设置线条形状 linestyle 、线条宽度 linewidth 以及线条颜色 color 来改变图形的样式。

# 线条颜色 color

  在 matplotlib 中有如下五种颜色的设置方式(还有其他如 cmap 等进阶方法暂时没有用到,故没有整理):
(1) RGB、RGBA
  在 matplotlib 中可以使用三元组 RGB ,即红、蓝、绿的分量,其中每个分量在 [0, 1] 区间内,因此 (1, 0, 0) 表示纯红色。四元组 RGBA 的前三个元素和三元组的定义相同,第四个元素定义透明度,也在 [0, 1] 区间内。使用案例如下:

import matplotlib.pyplot as plt
# 颜色用 [0,1] 之间的浮点数表示,四个分量按顺序分别为 (red, green, blue, alpha),其中 alpha 透明度可省略
plt.plot([1, 2, 3], [4, 5, 6], color=(0.1, 0.2, 0.5))
plt.plot([4, 5, 6], [1, 2, 3], color=(0.1, 0.2, 0.5, 0.5))
plt.show()

(2) HEX RGBHEX RGBA
   matplotlib 可以将 HTML 颜色字符串解释为实际颜色。这些字符串被定义为 #RRGGBB ,其中 RRGGBB 分别是使用十六进制编码的红色、绿色和蓝色分量。使用案例如下:

import matplotlib.pyplot as plt
# 用十六进制颜色码表示,同样最后两位表示透明度,可省略
plt.plot([1, 2, 3], [4, 5, 6], color='#0f0f0f')
plt.plot([4, 5, 6], [1, 2, 3], color='#0f0f0f80')
plt.show()

(3)灰度字符串
   matplotlib 将浮点值的字符串表示形式解释为灰度,例如 0.75 表示中浅灰色。使用案例如下:

import matplotlib.pyplot as plt
# 当只有一个位于 [0,1] 的值时,表示灰度色阶
plt.plot([1, 2, 3], [4, 5, 6], color='0.1')
plt.show()

(4)单字符基本颜色
   matplotlib 有八个基本颜色,可以用单字符串来表示,分别是 ‘b’, ‘g’, ‘r’, ‘c’, ‘m’, ‘y’, ‘k’, ‘w’ ,对应的是 blue, green, red, cyan, magenta, yellow, black, and white 的英文缩写,如下图所示:

(5)颜色名称
   matplotlib 提供了颜色对照表,可供查询颜色对应的名称,如下图所示:

# 线条样式

(1)折线形状

  • ‘-’ :实线
  • ‘-.’:实虚线
  • ‘–’ :虚线
  • ‘:’ :点虚线
    (2)节点形状
  • ‘s’ : 方块状
  • ‘o’ : 实心圆
  • ‘^’ : 正三角形
  • ‘v’ : 反正三角形
  • ‘+’ : 加号
  • ‘*’ : 星号
  • ‘,’ :点
  • ‘x’ : x 号
  • ‘p’ : 五角星
  • ‘1’ : 三脚架标记
  • ‘2’ : 三脚架标记

# 2.2 图形显示的一些设置

  设置图像的横纵坐标轴名称、图像标题、设置图例以及横纵坐标范围的示例程序(支持 latex )如下所示:

import matplotlib.pyplot as plt
import numpy as np
X = np.linspace(0, 1, 100)
Y1 = np.sqrt(X)
Y2 = X
Y3 = X * X
Y4 = X * X * X
plt.plot(X, Y1, color="lightcoral", linewidth=3.0, linestyle="-", label=r"$y_1=\sqrt{x}$")
plt.plot(X, Y2, color="burlywood", linewidth=3.0, linestyle="--", label=r"$y_2=x$")
plt.plot(X, Y3, color="mediumturquoise", linewidth=3.0, linestyle="-.", label=r"$y_3=x^2$")
plt.plot(X, Y4, color="mediumpurple", linewidth=3.0, linestyle=":", label=r"$y_4=x^3$")
# 常见的 legend 的 loc 位置还有 best, upper right, upper left, lower left, lower right,
# right, center left, center right, lower center, upper center, center,
# 其中 best 表示将标签加载到 python 认为最佳的位置。
plt.legend(loc="best")
# x、y 坐标以及标题
plt.xlabel('x', fontsize=18)
plt.ylabel('y', fontsize=18)
plt.title(r'$f(x)=\sqrt{x},x,x^2,x^3$', fontsize=18)
# 设置坐标范围
plt.ylim(-1, 3)
plt.xlim(-1, 3)
plt.show()

# 2.3 子图

   Matplotlib 的可以把很多张图画到一个显示界面,在作对比分析的时候非常有用。对应的有 pltsubplotsubplotsfigureadd_subplol 的方法,参数可以是一个三位数字(例如 111 ),也可以是一个数组(例如 [1,1,1] ), 3 个数字分别代表:子图总行数、子图总列数、子图位置。

# 通过 plt 的 subplot

import numpy as np
import matplotlib.pyplot as plt
# 画第 1 个图:折线图
plt.subplot(221)
x = np.arange(1, 100)
plt.plot(x, x * x)
# 画第 2 个图:散点图
plt.subplot(222)
plt.scatter(np.arange(0, 10), np.random.rand(10))
# 画第 3 个图:饼图
plt.subplot(223)
plt.pie(x=[15, 30, 45, 10], labels=list('ABCD'), autopct='%.0f', explode=[0, 0.05, 0, 0])
# 画第 4 个图:条形图
plt.subplot(224)
plt.bar([20, 10, 30, 25, 15], [25, 15, 35, 30, 20], color='b')
plt.show()

# 通过 plt 的 subplots

   subplots 返回的值的类型为元组,其中包含两个元素:第一个为一个画布,第二个是子图

import numpy as np
import matplotlib.pyplot as plt
fig,subs=plt.subplots(2,2)
# 画第 1 个图:折线图
x=np.arange(1,100)
subs[0][0].plot(x,x*x)
# 画第 2 个图:散点图
subs[0][1].scatter(np.arange(0,10), np.random.rand(10))
# 画第 3 个图:饼图
subs[1][0].pie(x=[15,30,45,10],labels=list('ABCD'),autopct='%.0f',explode=[0,0.05,0,0])
# 画第 4 个图:条形图
subs[1][1].bar([20,10,30,25,15],[25,15,35,30,20],color='b')
plt.show()

# 通过 figure 的 add_subplot

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
# 画第 1 个图:折线图
ax1 = fig.add_subplot(221)
x = np.arange(1, 100)
ax1.plot(x, x * x)
# 画第 2 个图:散点图
ax2 = fig.add_subplot(222)
ax2.scatter(np.arange(0, 10), np.random.rand(10))
# 画第 3 个图:饼图
ax3 = fig.add_subplot(223)
ax3.pie(x=[15, 30, 45, 10], labels=list('ABCD'), autopct='%.0f', explode=[0, 0.05, 0, 0])
# 画第 4 个图:条形图
ax4 = fig.add_subplot(224)
ax4.bar([20, 10, 30, 25, 15], [25, 15, 35, 30, 20], color='b')
plt.show()

以上三种方式生成的图形均如下所示:

# 如何不规则划分

import numpy as np
import matplotlib.pyplot as plt
# 画第 1 个图:折线图
plt.subplot(221)
x = np.arange(1, 100)
plt.plot(x, x * x)
# 画第 2 个图:散点图
plt.subplot(222)
plt.scatter(np.arange(0, 10), np.random.rand(10))
# 画第 3 个图:条形图
# 前面的两个图占了 221 和 222 的位置,如果想在下面只放一个图,得把前两个当成一列,即 2 行 1 列第 2 个位置
plt.subplot(212)
plt.bar([20, 10, 30, 25, 15], [25, 15, 35, 30, 20], color='b')
plt.show()

运行效果如下所示:

# 三、其他操作

# 3.1 绘图风格

   Matplotlib 库提供的 style.use() 函数可以为创建的图形设置合适的美学风格。官方文档中给出的可使用样式戳此,如下的示例中使用了 classic 风格的样式:

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('classic')
# 画第 1 个图:折线图
plt.subplot(221)
x = np.arange(1, 100)
plt.plot(x, x * x)
# 画第 2 个图:散点图
plt.subplot(222)
plt.scatter(np.arange(0, 10), np.random.rand(10))
# 画第 3 个图:条形图
# 前面的两个图占了 221 和 222 的位置,如果想在下面只放一个图,得把前两个当成一列,即 2 行 1 列第 2 个位置
plt.subplot(212)
plt.bar([20, 10, 30, 25, 15], [25, 15, 35, 30, 20], color='b')
plt.show()

运行效果如下图所示:

更新于 阅读次数