栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Matplotlib基本用法梳理

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Matplotlib基本用法梳理

Matplotlib 0 简介

Matplotlib是一个可视化python包,可以用很简单的代码展示2D绘图,如:直方图、折线图、条形图、散点图等。

其画图的基本组件包括:画板(figure),轴域(axes),子图(subplot),轴(axis),数据(x,y坐标)。

关于轴域和子图的相关性和区别,可以参考文末链接python matplotlib中axes与axis的区别是什么?。

1 安装
pip install matplotlib
import matplotlib
matplotlib.__version__ # 3.3.2
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')
# subplot生成的对象调用plot方法绘图
ax.plot(x,y, color='lightblue', linewidth=5)
# 类似于ax.set的方式,此处会覆盖上面的设置
ax.set_xlim(-2, 3) 
ax.set_ylim(-2, 5)

plt.show()

比较二者的实现方式,第一种会更简单,更加适合不需要子图的场景;第二种更容易理解,将figure和axes等概念一步步创建,且适合多子图的场景。

2.2 子图的创建
fig = plt.figure() # 画板
ax1 = fig.add_subplot(221) # 2*2划分画板,第1块子图
ax2 = fig.add_subplot(222) # 2*2划分画板,第2块子图
ax3 = fig.add_subplot(224) # 2*2划分画板,第4块子图
fig, axes = plt.subplots(nrows=2, ncols=2) # 直接生成2*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,y坐标即可画出线图
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)

# Plot the "centerline" with `plot`
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  # 0 to 15 point radii

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)  # only "explode" the 2nd slice (i.e. 'Hogs')

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 基本属性
# 属性备注 plt.X
-xlim: -ylim: xy轴的坐标左右界限
-xlabel: -ylabel: xy轴的坐标名称
-title:figure或subplot的名称
-legend(): 图例,默认自动识别最适合的位置,即best。此外,可以通过传参`loc=2`来指定位置,具体含10个位置
-xticks(范围,值list): 修改坐标显示的值
# plot: 
	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]) # fig.add_axes([left, bottom, width, height])
print(ax)
plt.show()

* 附录 1 axes和subplot的区别?

可以将figure看作画板,subplot可以看作将画板划分为若干个画布

* 参考
  • 官网doc
  • Matplotlib教程~C语言中文网
  • Python–Matplotlib~CSDN高评价文章
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/348328.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号