Python 在处理数据、分析数据以及数据可视化方面拥有很多功能强大的工具,这也是 Python 在科学领域中能够迅速发展的一个主要原因。今天记录一下matplotlib,在数据可视化方面,你必须熟练shying它。
Matplotlib
Matplotlib 是 Python 的一个绘图库。它包含了大量的工具,你可以使用这些工具创建各种图形,包括简单的散点图,正弦曲线,甚至是三维图形。Python 科学计算社区经常使用它完成数据可视化的工作。
首先引入模块包:
import matplotlib.pyplot as plt
画一段正弦曲线
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(1,10,50) #在指定的间隔内返回均匀间隔的数字。
plt.plot(x,np.sin(x)) #定义显示x轴,y轴数据
plt.show() #图显示
输出图形如下:
plt_output_sin.png
叠加绘制两个数据集
试试用上面的50个数字绘制正弦曲线和余弦曲线的叠加。
plt.plot(x,np.sin(x),x,np.cos(x))
plt.show()
输出图形如下:
plt_2layer_sinXcos.png
自定义图形的外观
当在同一个图形上展示多个数据集时,通过改变线条的外观来区分不同的数据集变得非常必要。
plt.plot(x,np.sin(x),'r-o',x,np.cos(x),'g--')
plt.show()
输出图形如下:
set_linetype.png
代码展示了两种不同的曲线样式:'r-o' 和 'g--'
处理文字
text()命令可以在任意的位置添加文字,xlabel(),ylabel(),title()分别是添加x轴,y轴标签和标题。
import matplotlib.pyplot as plt
import numpy as np
# Fixing random state for reproducibility
np.random.seed(19680801)
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
# the histogram of the data
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='b', alpha=0.75)
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
输出图形:
所有的text()命令会返回一个matplotlib.text.Text实例,通过属性或者setp()来改变他们。
t = plt.xlabel(‘my data’, fontsize=14, color=’red’)
使用数学表达式
plt.title(r'$\sigma_i=15$')
前置的r是指定它后面的字符串是原始的字符串,然后用$包裹表示中间的是数学表达式,\表示转译具体的数学符号。
注释
annotate()方法提供了一个注释的方法。
annotate(string,xy,xytest,arrowprops)
ax = plt.subplot(111)
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)
plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
arrowprops=dict(facecolor='red', shrink=0.05),
)
plt.ylim(-2,2)
plt.show()
输出图形:
plot_annotate.png
默认的情况下,xy和xytext使用的坐标是数据的坐标,你也可以指定其他的坐标系统。
使用子图
在一个窗口绘制多张图,将上述的叠加的用不同曲线样式的例子用子图的方式改造:
plt.subplot(2,1,1)
plt.plot(x,np.sin(x),'r-o')
plt.subplot(2,1,2)
plt.plot(x,np.cos(x),'g--')
plt.show()
输出图形如下:
2layer_subgraph.png
使用子图只需要一个额外的步骤,就可以像前面的例子一样绘制数据集。即在调用 plot() 函数之前需要先调用 subplot() 函数。该函数的第一个参数代表子图的总行数,第二个参数代表子图的总列数,第三个参数代表活跃区域。
活跃区域代表当前子图所在绘图区域,绘图区域是按从左至右,从上至下的顺序编号。例如在 3×3 的方格上,活跃区域 4 在方格上的坐标为 (1, 1)。
散点图
散点图是一堆离散点的集合。用 Matplotlib 画散点图也同样非常简单。
还以画正弦曲线为例:
plt.scatter(x,np.sin(x))
plt.show()
输出图形:
plt_scatter.png
只需要调用 scatter() 函数并传入两个分别代表 x 坐标和 y 坐标的数组。注意,我们通过 plot 命令并将线的样式设置为 'bo' 也可以实现同样的效果。
彩色映射散点图
另一种你可能用到的图形是彩色映射散点图。这里我们会根据数据的大小给每个点赋予不同的颜色和大小,并在图中添加一个颜色栏。
x = np.random.rand(1000)
y = np.random.rand(1000)
size = np.random.rand(1000)*50
colors = np.random.rand(1000)
plt.scatter(x,y,size,colors)
plt.colorbar()
plt.show()
输出图形:
plt_scatter_colors.png
上面的代码大量的用到了 np.random.rand(1000),原因是我们绘图的数据都是随机产生的。
同前面一样我们用到了 scatter() 函数,但是这次我们传入了另外的两个参数,分别为所绘点的大小和颜色。通过这种方式使得图上点的大小和颜色根据数据的大小产生变化。
然后我们用 colorbar() 函数添加了一个颜色栏。
直方图
直方图是 Matplotlib 中最简单的图形之一。你只需要给 hist() 函数传入一个包含数据的数组。第二个参数代表数据容器的个数。数据容器代表不同的值的间隔,并用来包含我们的数据。数据容器越多,图形上的数据条就越多。
z = np.random.rand(1000)
plt.hist(z,50)
plt.show()
输出图形:
plt_column.png
添加标题、坐标轴标记和图例
数据仍然使用上述正弦曲线和余弦曲线叠加图的那个,现在把标签和纵横坐标标签以及图例加上:
plt.plot(x,np.sin(x),'r-o',label='Sin(x)') # 要显示图例,需定义lable参数
plt.plot(x,np.cos(x),'g-^',label='Cos(x)')
plt.legend() #图例
plt.xlabel('Xlabel') #x轴标签
plt.ylabel('Ylabel') #y轴标签
plt.title('my title') # 标题
plt.show()
输出图形:
plt_complete.png