Matplotlib
0 简介
Matplotlib是一个可视化python包,可以用很简单的代码展示2D绘图,如:直方图、折线图、条形图、散点图等。
其画图的基本组件包括:画板(figure),轴域(axes),子图(subplot),轴(axis),数据(x,y坐标)。
关于轴域和子图的相关性和区别,可以参考文末链接python matplotlib中axes与axis的区别是什么?。
1 安装
pip install matplotlib
import matplotlib
matplotlib.__version__
2 2D图用法
2.1 基础用法
以最简单的直线图为例,有两种方法。其一是通过pyplot 包下的plot() 方法直接绘制:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2,2,50)
y = 2 * x + 0.1
plt.plot(x, y, color='lightblue', linewidth=5)
plt.xlim(-2,3)
plt.ylim(-2,5)
plt.title("A demo of plot")
plt.show()
其二,是通过创建画布和axes,用对象调用的方式实现:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2,2,50)
y = 2 * x + 0.1
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set(xlim=[0,1], ylim=[-2, 8], title='An Example Axes', ylabel='Y-Axis', xlabel='X-Axis')
ax.plot(x,y, color='lightblue', linewidth=5)
ax.set_xlim(-2, 3)
ax.set_ylim(-2, 5)
plt.show()
比较二者的实现方式,第一种会更简单,更加适合不需要子图的场景;第二种更容易理解,将figure和axes等概念一步步创建,且适合多子图的场景。
2.2 子图的创建
fig = plt.figure()
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(224)
fig, axes = plt.subplots(nrows=2, ncols=2)
axes[0,0].set(title='Upper Left')
axes[0,1].set(title='Upper Right')
axes[1,0].set(title='Lower Left')
axes[1,1].set(title='Lower Right')
2.3 线图plot
x = np.linspace(-np.pi,np.pi)
y = np.sin(x)
plt.plot(x,y , color='lightblue', linewidth=3)
plt.xlim(-np.pi)
plt.show()
通过关键字绘图,json格式保存数据:
x = np.linspace(0, 10, 200)
data_obj = {'x': x,
'y1': 2 * x + 1,
'y2': 3 * x + 1.2,
'mean': 0.5 * x * np.cos(2*x) + 2.5 * x + 1.1}
fig, ax = plt.subplots()
ax.fill_between('x', 'y1', 'mean', color='yellow', data=data_obj)
ax.plot('x', 'y2', color='black', data=data_obj)
plt.show()
2.4 散点图scatter
输入同上,只不过仅仅描绘点,不连边
2.4 柱状图
np.random.seed(1)
x = np.arange(5)
y = np.random.randn(5)
fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1./2))
vert_bars = axes[0].bar(x, y, color='lightblue', align='center')
horiz_bars = axes[1].barh(x, y, color='lightblue', align='center')
axes[0].axhline(0, color='gray', linewidth=2)
axes[1].axvline(0, color='gray', linewidth=2)
plt.show()
2.5 箱型图
fig, (ax1, ax2) = plt.subplots(2)
ax1.boxplot(data)
ax2.boxplot(data2, vert=False)
2.6 气泡图
np.random.seed(19680801)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2
plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()
2.7 直方图
用于统计出现次数或频率
2.8 饼图
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)
fig1, (ax1, ax2) = plt.subplots(2)
ax1.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=True)
ax1.axis('equal')
ax2.pie(sizes, autopct='%1.2f%%', shadow=True, startangle=90, explode=explode,
pctdistance=1.12)
ax2.axis('equal')
ax2.legend(labels=labels, loc='upper right')
plt.show()
2.9 等高线
fig, (ax1, ax2) = plt.subplots(2)
x = np.arange(-5, 5, 0.1)
y = np.arange(-5, 5, 0.1)
xx, yy = np.meshgrid(x, y, sparse=True)
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
ax1.contourf(x, y, z)
ax2.contour(x, y, z)
3 属性方法
3.1 基本属性
-xlim: -ylim: xy轴的坐标左右界限
-xlabel: -ylabel: xy轴的坐标名称
-title:figure或subplot的名称
-legend(): 图例,默认自动识别最适合的位置,即best。此外,可以通过传参`loc=2`来指定位置,具体含10个位置
-xticks(范围,值list): 修改坐标显示的值
color:线条颜色(lightblue,red)
linewidth:线条宽度
marker:线图标记(+)
linestyle:线条样式(dashed虚线)
label:str,用于显示图例或区分多线条
xticks() 例子:
x = np.linspace(-np.pi,np.pi)
y = np.sin(x)
plt.plot(x,y , color='lightblue', linewidth=3, label='A')
plt.plot(x,y+1 , linewidth=3, label='B')
plt.legend(loc=4)
plt.xlim(-np.pi)
plt.xticks(np.arange(-3,4,2),[1,2,3,4])
plt.show()
3.2 布局
通过fig.subplots_adjust() 我们修改了子图水平之间的间隔wspace=0.5 ,垂直方向上的间距hspace=0.3 ,左边距left=0.125 等等,这里数值都是百分比的。以[0, 1] 为区间,选择left 、right 、bottom 、top 注意 top 和 right 是 0.9 表示上、右边距为百分之10。不确定如果调整的时候,fig.tight_layout() 是一个很好的选择。之前说到了内边距,内边距是子图的,也就是 Axes 对象,所以这样使用 ax.margins(x=0.1, y=0.1),当值传入一个值时,表示同时修改水平和垂直方向的内边距。
fig, axes = plt.subplots(2, 2, figsize=(9, 9))
fig.subplots_adjust(wspace=0.5, hspace=0.3,
left=0.125, right=0.9,
top=0.9, bottom=0.1)
fig.tight_layout()
plt.show()
3.3 axes子图
区别于subplot创建的子图,axes将在figure上创建子域,并且可以重叠。
fig = plt.figure()
ax = fig.add_subplot(111)
ax3 = fig.add_axes([0.3,0.2,0.4,0.5])
print(ax)
plt.show()
* 附录
1 axes和subplot的区别?
可以将figure看作画板,subplot可以看作将画板划分为若干个画布
* 参考
|