不论是数据挖掘还是数学建模, 都免不了数据可视化的问题. 对于 Python 来说, matplotlib 是最著名的绘图库, 它主要用于二维绘图, 当然也可以进行简单的三维绘图. 它不但提供了一整套和 Matlab 相似但更为丰富的命令, 让我们可以非常快捷地用 python 可视化数据.
matplotlib 基础
- # 安装
- pip install matplotlib
两种绘图风格:
MATLAB 风格:
基本函数是 plot, 分别取 x,y 的值, 然后取到坐标 (x,y) 后, 对不同的连续点进行连线.
面向对象:
创建一个图形 fig 和一个坐标 ax .
fig:figure(plt.Figure) 是一个能容纳各种坐标轴, 图形, 文字和标签的容器.
ax:axes(plt.Axes) 是一个带有刻度和标签的矩形, 最终会包含各种可视化元素.
示例:
- import matplotlib.pyplot as plt
- import numpy as np
- # 图形显示风格
- plt.style.use('seaborn-whitegrid')
- # 创建 fig 和 ax
- fig = plt.figure()
- ax = plt.axes()
- x = np.linspace(0,10,100)
- # 显示 sin 函数图形
- plt.plot(x, np.sin(x))
- # 显示 cos 函数图形
- plt.plot(x, np.cos(x))
- plt.show()
这就是利用面向对象的方式绘图, 在交互模式中可以看到, 每画一个图就是产生一个对象, 最后再显示出来.
绘图样式
- # 调整坐标轴上下限
- plt.xlim([xmin, xmax])
- plt.ylim([ymin, ymax])
- plt.axis([xmin, xmax, ymin, ymax])
- # 参数: tight: 把图形设置成紧凑模式, 不留多余的部分
- # equal: 图形显示分辨率为 1:1
线形图
文字设置
图形标题: plt.title
坐标轴标题: plt.xlabel, plt.ylabel
基础图例: plt.legend
注意: 对中文不友好, 需要额外方法, 尽量使用英文
- # 示例
- import matplotlib.pyplot as plt
- import numpy as np
- x = np.linspace(1, 10, 100)
- plt.plot(x, np.sin(x))
- plt.title('sin-function')
- plt.xlabel('x-value')
- plt.ylabel('y-label')
- plt.show()
图例
通过 legend 可以设置图例, 同时通过参数的调整可以细腻的设置图例的位置, 形式等. 参数主要包括:
loc: 图例的位置
frameon: 是否带边框
framealpha: 颜色透明
shadow: 阴影
- # 示例
- import matplotlib.pyplot as plt
- import numpy as np
- x = np.linspace(1, 10, 100)
- fig, ax = plt.subplots()
- ax.plot(x, np.sin(x), color='red', label='sin-function')
- ax.plot(x, np.cos(x), color='blue', label='cos-function')
- ax.legend(loc='upper right', frameon=True, shadow=True, framealpha=0.2)
- # 设置图例位置为右上, 有边框, 有阴影, 且透明度为 0.2
- plt.show()
颜色条
- import matplotlib.pyplot as plt
- import numpy as np
- x = np.linspace(1, 10, 100)
- I = np.sin(x) * np.cos(x[:,np.newaxis])
- plt.imshow(I)
- plt.colorbar()
- plt.show()
散点图
散点图基础
散点图主要以点为主, 数据是不连续的数据, 通过设置线的型号来完成. 型号包括'o','+','*','1','h','D'等等, 具体使用探索一下就好, 用不到太多.
- import matplotlib.pyplot as plt
- import numpy as np
- # 图形显示风格
- plt.style.use('seaborn-whitegrid')
- x = np.linspace(0, 10, 30)
- y = np.sin(x)
- # 通过设置线型为点来完成散点图的绘制
- plt.plot(x, y, 'o', color='blue')
- plt.show()
如果设置线型为点线结合, 那么将绘制出连续的线, 对应点处为所设置的点型.
画散点图还可以使用 scatter 函数来画, 他有很多更细节的描述, 用法与 plot 类似, 对于数据量较大的可视化时, plot 的效率更高一些.
误差线
- import matplotlib.pyplot as plt
- import numpy as np
- # 图形显示风格
- plt.style.use('seaborn-whitegrid')
- x = np.linspace(0, 10, 30)
- dy = x * 0.5
- y = np.sin(x) + dy
- plt.errorbar(x, y, yerr=dy, fmt='.k', ecolor='blue')
- plt.show()
连续误差线表示的是连续量, 可以使用 plt.plot 和 plt.fill_between 来画出.
- import matplotlib.pyplot as plt
- import numpy as np
- # 图形显示风格
- plt.style.use('seaborn-whitegrid')
- x = np.linspace(0, 10, 30)
- ysin = np.sin(x)
- ycos = np.cos(x)
- plt.plot(x, ysin, color='red')
- plt.plot(x, ycos, color='blue')
- plt.fill_between(x, ysin, ycos, color='gray', alpha=0.2)
- plt.show()
等高线(密度)
plt.contour 等高线
plt.contourf 自带填充颜色
plt.imshow 显示图形
等高线绘制方法: z = f(x,y),z 表示高度. 当只有一个颜色绘图时, 虚线表示负值, 实线表示正值. meshgrid 可以将一维数据变成二维网格数据.
- import matplotlib.pyplot as plt
- import numpy as np
- def f(x, y):
- return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
- x = np.linspace(0, 5, 50)
- y = np.linspace(0, 5, 40)
- # 得到网格点矩阵
- x, y =np.meshgrid(x, y)
- # 计算 z 轴的值
- z = f(x, y)
- # 绘制图形
- plt.contour(x, y, z, colors='green')
- # plt.contour(x, y, z, 50, cmap='RdGy') # 更改配色, 值 50 等分, 红灰配色
- plt.show()
plt.contourf(x, y, z, 50, cmap='RdGy') # 改为 contourf, 自动填充颜色, 则变为连续的
直方图
基本画法: plt.hist 可以直接画直方图, 参数主要包括:
bins: 划分段(柱数)
color: 颜色
alpha: 透明度
histtype: 图类型
- import matplotlib.pyplot as plt
- import numpy as np
- data = np.random.randn(1000)
- plt.hist(data, bins=30, alpha=0.3, histtype='stepfilled', color='blue', edgecolor='none')
- plt.show()
程序中 random.randn 与 random.rand 相比, randn 表示随机生成的数符合正态分布, 因此画出图来是如上图所示.
子图
- plt.subplot(2,1,1) # 子图,(2,1,1)代表, 创建 2*1 的画布, 并且定位于画布 1 ; 等效于 plt.subplot(211), 即去掉逗号
- # subplots 可以同时创建多个子图
- figure,ax = plt.subplots(2, 3)
- # 这是一个灵活创建子图的方法, 可以创建任意组合的图形, 不必一一对齐, 以下为示例:
- grid = plt.GridSpec(2, 3, wspace=0.3, hspace=0.2)
- plt.subplot(grid[,:2])
- plt.subplot(grid[1,1:3])
图例配置
文字注释
通过不同的坐标变换, 可以把文字放在不同的位置:
ax.transData: 以数据为基准
ax.transAxes: 以轴为基准
- import matplotlib.pyplot as plt
- import numpy as np
- fig, ax = plt.subplots()
- ax.axis = ([0, 1, 0, 1])
- ax.text(0.5, 0.5, "Data:(0.5, 0.5)", transform=ax.transData)
- ax.text(0.5, 0.1, "Axes:(0.5, 0.1)", transform=ax.transAxes)
- plt.show()
箭头注释
plt.arrow: 产生 SVG 向量图形式的箭头, 会随着分辨率改变而改变, 不推荐
plt.annotate: 可以创建文字和箭头
- import matplotlib.pyplot as plt
- import numpy as np
- fig, ax = plt.subplots()
- x = np.linspace(0, 20, 1000)
- ax.plot(x, np.cos(x))
- ax.axis('equal')
- ax.annotate("max", xy=(6.28, 1), xytext=(10, 4), arrowprops=dict(facecolor='black', shrink=0.05))
- ax.annotate('min', xy=(5 * np.pi, -1), xytext=(2, -6), arrowprops=dict(arrowstyle="->", connectionstyle='angle3, angleA=0, angleB=-90'))
- plt.show()
三维图
基础三维图
matplotlib 中绘制三维图用到 mplot3d 包. 导入 mplot3d 包后, 可以利用 projection 参数, 控制绘制三维图.
- import numpy as np
- import matplotlib.pyplot as plt
- from mpl_toolkits import mplot3d
- fig = plt.figure()
- ax = plt.axes(projection='3d')
- plt.show()
三维图中当然包含三个轴, x,y,z. 画线 ax.plot3D, 画点 ax.scatter3D. 为了三维效果, 它会自动将远处的点颜色变浅.
- import numpy as np
- import matplotlib.pyplot as plt
- from mpl_toolkits import mplot3d
- fig = plt.figure()
- ax = plt.axes(projection='3d')
- z = np.linspace(0, 15, 100)
- x = np.sin(z)
- y = np.cos(z)
- ax.plot3D(x, y, z, 'red')
- ax.scatter3D(x, y, z, 'blue')
- plt.show()
三维等高线
- import numpy as np
- import matplotlib.pyplot as plt
- from mpl_toolkits import mplot3d
- fig = plt.figure()
- ax = plt.axes(projection='3d')
- def f(x, y):
- return np.sin(np.sqrt(x ** 2 + y ** 2))
- x = np.linspace(-6, 6, 30)
- y = np.linspace(-6, 6, 30)
- X, Y =np.meshgrid(x, y)
- Z = f(X, Y)
- ax.contour3D(X, Y, Z, 50)
- plt.show()
图形绘制出来后, 可以通过 ax.view_init 来控制观察的角度, 便于理解.
俯仰角度: x-y 平面的旋转角度
方位角度: 沿着 z 轴顺时针旋转角度
pandas 绘图
上篇文章讲述了 pandas 的基本用法, pandas 是数据分析中最重要的工具之一, 这里补充一下 pandas 绘图.
Series 绘图
- # 这是一个小栗子
- s1 = Series(np.random.randint(1000).cumsum()) # 创建 series,cumsum()是指叠加求和, 本位数是前几项之和
- s1.plot() # series 有自己的 plot 函数, 里面可以写入想要的参数
DataFrame 绘图
- df = DataFrame(
- np.random.randint(1,10,40).reshape(10,4),
- columns=['A','B','C','D']
- )
- df.plot()
- # dataframe 也有自己的 plot, 按列画出来, 参数包含 ax, 选择输出的画布
- # 参数: stacked=True, 表示一个堆叠的情况, 同一个 index 下, columns 一不同颜色叠在一起
来源: https://www.cnblogs.com/yudanqu/p/12662470.html