不管是数据挖掘仍是数学建模,都免不了数据可视化的问题。对于 Python 来讲,matplotlib 是最著名的绘图库,它主要用于二维绘图,固然也能够进行简单的三维绘图。它不但提供了一整套和 Matlab 类似但更为丰富的命令,让咱们能够很是快捷地用 python 可视化数据。python
# 安装 pip install matplotlib
两种绘图风格:dom
MATLAB风格:函数
基本函数是 plot,分别取 x,y 的值,而后取到坐标(x,y)后,对不一样的连续点进行连线。工具
面向对象:spa
建立一个图形 fig 和一个坐标 ax 。3d
fig:figure(plt.Figure) 是一个能容纳各类坐标轴,图形,文字和标签的容器。
ax:axes(plt.Axes) 是一个带有刻度和标签的矩形,最终会包含各类可视化元素。
示例:code
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()
这就是利用面向对象的方式绘图,在交互模式中能够看到,每画一个图就是产生一个对象,最后再显示出来。orm
绘图样式对象
# 调整坐标轴上下限 plt.xlim([xmin, xmax]) plt.ylim([ymin, ymax]) plt.axis([xmin, xmax, ymin, ymax]) # 参数:tight:把图形设置成紧凑模式,不留多余的部分 # equal:图形显示分辨率为1:1
文字设置blog
图形标题: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 绘图。
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一不一样颜色叠在一块儿