Maplotlib
本文档由萌狼蓝天写于2022年7月24日
目录
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False # 正常显示负号
(一)Matplotlib三层结构
- 容器层
- canvas
- figure
- axes
- 辅助显示层
- 添加x轴、y轴描述,标题等内容
- 图像层
- 绘制什么图像的声明
(二)画布创建、图像绘制、图像显示
# 创建画布 plt.figure() x = [1,2,3,4,5] # x轴上数据 y = [3,5,8,13,21] # y轴上数据 plt.plot(x,y) # 绘制图像 plt.show() # 显示图像
(三)图像画布设置、图像保存
# 创建画布 plt.figure(figsize=(10,5),dpi=360) # figsize设置宽高(物理),dpi设置像素(清晰度)。 # 上述语句 返回的是一个fig对象 # 【注意】plt.show() 会释放figure资源,如果在线上图像之后保存图片将只能保存空图片 x = [1,2,3,4,5] # x轴上数据 y = [3,5,8,13,21] # y轴上数据 plt.plot(x,y) # 绘制图像 plt.savefig("auto_create_test01.jpg") # 保存图像 plt.show() # 显示图像
import random x = range(100) y_a = [random.uniform(0,30) for i in x] # 生成数的数量对应x,生成数的值为0-30之间的随机数 print(x) print("---华丽的分割线---") print(y_a)
range(0, 100) ---华丽的分割线--- [12.982672509679087, 4.148460810792916, 23.28235249294327, 21.87989699514037, 2.769903367325226, 25.81845792348358, 3.54269402963334, 2.585603726507065, 26.353567263372167, 20.1724515831709, 9.846906537087849, 18.642794021897725, 28.003744340329156, 16.872567782729124, 21.612800689540776, 11.990215915808118, 17.191944072247612, 14.599968428883773, 8.928751599348555, 28.84921690440148, 1.5811419916444414, 28.347437767253062, 4.1844970314337395, 1.4484554776084402, 23.746856993211154, 25.215123023800903, 8.308284357407098, 20.905033782595766, 1.7060361916369626, 25.824999733060757, 25.861418590294413, 18.934895151240344, 29.156472327174725, 19.73204522971468, 27.62189040636267, 4.0745889532346355, 0.8561484814978759, 16.990698526758948, 13.695538355532968, 19.102876219033302, 26.73750193106295, 8.874796595298546, 19.63252230758577, 5.410863374583021, 28.959501437890072, 13.141025987347465, 11.963738613483583, 10.134532811707164, 2.4713136683034986, 26.003968284802426, 14.971877506465844, 14.571620590922555, 29.08039067376321, 2.2940372824311894, 8.146485905161393, 0.7551511667468636, 25.783877538176437, 19.827089802343014, 6.316807614490154, 12.191817760896198, 29.265434441425686, 1.4430630147755286, 27.15559634706954, 25.33537321637355, 14.537826820603485, 14.752792676788385, 1.8704608188174754, 13.895073232049324, 22.79035528366605, 11.12232898307558, 5.16784304566163, 22.837175426537577, 4.0677013250654435, 27.975154486709634, 3.286664382643265, 10.632525108000943, 4.411311190562859, 10.723165062794324, 29.44814886086931, 20.408896064347594, 15.803205938537028, 16.523604028883916, 19.623136101583274, 4.321189078434246, 29.106159249131583, 10.836444462865161, 7.254473087449349, 2.884588234408815, 13.263596148346446, 17.293710076942403, 21.826173895085446, 29.465860746443976, 21.558510008254462, 13.979606990999239, 23.065135048263528, 6.406772645073375, 17.224958179811374, 23.067953124213787, 29.055332612173245, 0.046758792875690736]
plt.figure(figsize=(10,5),dpi=300)# 创建画布 plt.plot(x,y_a) # 绘画 plt.show() # 显示
(四)自定义x、y轴的刻度
- plt.xticks(x,**kwargs) # x 表示要刻度的值
- plt.yticks(y,**kwargs) # y 表示要刻度的值
x = range(100) y_a = [random.uniform(0,50) for i in x] plt.figure(figsize=(25,5),dpi=300)# 创建画布 plt.plot(x,y_a) # 绘画 # 构造x轴刻度标签 x_ticks_label = ["零点{}分".format(i) for i in x] # 构造y轴刻度 y_ticks = range(60) # 修改x、y轴刻度显示 plt.xticks(x[::5],x_ticks_label[::5]) plt.yticks(y_ticks[::5]) # ::5 意味着 从头到尾 每间隔5取 #【注意】第一个参数必须是数字,如果不是数字需要进行值的替换 plt.show()
(五)添加网格显示
x = range(100) y_a = [random.uniform(0,50) for i in x] plt.figure(figsize=(25,5),dpi=300)# 创建画布 plt.plot(x,y_a) # 绘画 # 构造x轴刻度标签 x_ticks_label = ["零点{}分".format(i) for i in x] # 构造y轴刻度 y_ticks = range(60) # 修改x、y轴刻度显示 plt.xticks(x[::5],x_ticks_label[::5]) plt.yticks(y_ticks[::5]) # ::5 意味着 从头到尾 每间隔5取 #【注意】第一个参数必须是数字,如果不是数字需要进行值的替换 plt.grid(True,linestyle="--",alpha=0.5) # 添加网格 # 第一个参数(boolean) 是否添加 # 第二个参数(linestyle) 曲线还是直线 # 第三个参数 (alpha)透明度 plt.show()
(六)添加描述信息、一图多线、显示图例
x = range(50) y_a = [random.uniform(0,50) for i in x] y_b = [random.uniform(0,50) for i in x] plt.figure(figsize=(10,5),dpi=300)# 创建画布 plt.plot(x,y_a) # 绘画 plt.plot(x,y_b) # 绘画 x_ticks_label = ["零点{}分".format(i) for i in x] y_ticks = range(60) plt.xticks(x[::5],x_ticks_label[::5]) plt.yticks(y_ticks[::5]) plt.grid(True,linestyle="--",alpha=0.5) # 添加网格 # 添加描述 plt.title("Just Play",fontsize=24) plt.xlabel("时间") plt.ylabel("温度") # 显示图例 plt.plot(x,y_a,color="r",linestyle="-",label="A") # 绘画 plt.plot(x,y_b,color="b",linestyle="--",label="B") # 绘画 plt.legend(loc="upper right")# 显示图例必须在绘制时设置好 plt.show()
图例图形风格设置参考表
颜色字符 | 对应颜色 |
r | 红色 |
g | 绿色 |
b | 蓝色 |
w | 白色 |
c | 青色 |
m | 洋红色 |
y | 黄色 |
k | 黑色 |
风格字符 | 对应风格 |
- | 实线 |
-- | 虚线 |
-. | 点划线 |
: | 点虚线 |
'' | 留空、空格 |
(七)多坐标系绘制
x = range(50) y_a = [random.uniform(0,50) for i in x] y_b = [random.uniform(0,50) for i in x] # plt.figure(figsize=(10,5),dpi=300)# 创建画布 fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(20,5),dpi=300) x_ticks_label = ["零点{}分".format(i) for i in x] y_ticks = range(60) # plt.xticks(x[::5],x_ticks_label[::5]) # plt.yticks(y_ticks[::5]) axes[0].set_xticks(x[::5]) axes[0].set_yticks(y_ticks[::5]) axes[1].set_xticks(x[::5]) axes[1].set_yticks(y_ticks[::5]) axes[1].set_xticklabels(x_ticks_label[::5]) # 添加描述 # plt.title("Just Play",fontsize=24) axes[0].set_title("Just Play A",fontsize=24) axes[1].set_title("Just Play B",fontsize=24) # plt.xlabel("时间") # plt.ylabel("温度") axes[0].set_ylabel("摄氏度") axes[1].set_ylabel("华氏度") axes[0].set_xlabel("21日数据") axes[1].set_xlabel("22日数据") # 显示图例 # plt.plot(x,y_a,color="r",linestyle="-",label="A") # 绘画 # plt.plot(x,y_b,color="b",linestyle="--",label="B") # 绘画 axes[0].plot(x,y_a,color="r",linestyle="-",label="A") axes[1].plot(x,y_b,color="b",linestyle="--",label="B") # plt.legend(loc="upper right")# 显示图例必须在绘制时设置好 axes[0].legend(loc="upper right")# 显示图例必须在绘制时设置好 axes[1].legend(loc="upper right")# 显示图例必须在绘制时设置好 # 添加网格 # plt.grid(True,linestyle="--",alpha=0.5) # 添加网格 axes[0].grid(True,linestyle="--",alpha=0.5) axes[1].grid(True,linestyle="-.",alpha=1) plt.show()
(八)常见图形绘制
1.绘制数学函数图像
import numpy as np # 准备数据 x = np.linspace(-10,10,1000) # 从-10到10 生成1000个数据(数据越多,线条越顺畅自然) y = np.sin(x) # 创建画布 plt.figure(figsize=(5,2.5),dpi=300) # 绘制函数图像 plt.plot(x,y) # 添加网格显示 plt.grid() # 显示图像 plt.show()
2.散点图
# 数据准备 import random x = range(30) y = [random.uniform(30,60) for i in x] # 创建画布 plt.figure(figsize=(10,5),dpi=300) # 图像绘制 plt.scatter(x,y) # 图像显示 plt.show()
3.柱状图
data_name = ['我是路人甲','山哥之王','山鸡之王','山崖传说','神秘姥爷','嘎腰子传说','嘤呜','我直呼好家伙',"乌拉","一拳一个"] data_love = [1684,8664,8469,6468,5381,6584,1466,6458,4476,6584] x = range(len(data_name)) y = data_love plt.figure(figsize=(15,3),dpi=100) plt.bar(x,y,width=0.5,color=["r","g","b","m","y","c","k"],align="center") # 对齐方式有edge和center两种 plt.xticks(x,data_name,fontsize=12) plt.show()
4.直方图
x = np.random.normal(50,10,1000) # (均值,标准差,个数) y = range(50) plt.figure(figsize=(15,3),dpi=100) plt.hist(x,bins=50,density=True, color='g', alpha=1) plt.show()
5.饼状图
x = [random.randint(0,10) for i in range(5)] # 随机生成5个数,每个数的值在0-9之间 plt.figure(figsize=(15,3),dpi=100) plt.pie(x) # x:数量,会根据数量自动计算百分比 labels:每部分的名城 autopct:占比显示指定 %1.2f%% colors:每部分的颜色 plt.show()