Matplotlib库的基础知识
一、绘图结构
如果用通俗的比喻来形容matplotlib的结构的话:
1.Backend 是后端,对应“厨房中的厨具”,它在厨师手中能用来做各种菜【负责像素填色和图像的编码】
2.Aritist 是绘图对象,对应厨师,厨师会操作厨具完成烹饪【能对backend进行具体绘制操作】
3.pyplot 是函数封装,对应菜谱,厨师可以按照菜谱根据已有的程序进行烹饪【封装了一些函数和方法】
二、万物皆Artist
matplotlib可以将万物当做Artist(刻度,图例,网格,线,标签等等)
- Artist两类
1.容器类(负责描述容器属性,包含原始类Artist) 【并不直接负责图上具体图形元素】
2.原始类(描述具体图形元素,例如线段,多边形,文字等)
- Figure和Axes
1.Figure(画布)描述画布的整体属性,包括尺寸、分辨率等信息。一个画布中要包含一个或者多个Axes(子图),这些子图可以在Figure中任意摆放。
2.Figure基本上是不含有原始类,一般是无法进行直接绘图的,但是Axes即子图是包含原始类的,在使用的时候并不会手动生成对应的原始类Artist而是Axes对象封装的助手方法。
- plt和ax,fig的区别
1.在绘图中,plt是不限制于ax和fig的,它实际上是获取当前axes然后再上面作图。
2.plt是隐式创建直接在幕布上画图,而ax是显式创建在已创建的画布中的子图中画。
3.plt对调整细节十分不友好,因此一般来说用于发表论文的图不会使用plt方法,全部都是定义ax对象然后利用辅助方法来绘制图形。
- ax的常用助手方法
1.ax.bar(x, y) # 绘制条形图
2.ax.legend(loc="upper left", prop={这里和font一样},bbox_to_anchor=(0.1, 0.1)) # 添加图例,其中bbox_to_anchor有了就不要loc了,bbox_to_anchor第一个参数越大越往右,第二个参数越大越往上【一定要记住它使用prop来指明字体设置的,而其他方法是用font={}来指定的】,legend还可以增加一个列表表示添加的图例的字符串名称,但是这只能对用ax定义的图进行定义图例。
3.ax.plot() # 子图绘制(不光可以接受列表,还可以接受数组)
4.ax.set_xticks() # xticks只输入列表或者数组等,后面不加参数,参数在xticklabels设置
5.ax.set_xticklabels() # xticklabels将对xticks定义的数值标签进行字符串标签转换,后可加例如font={"family":"Times New Roman", "size": 80}来设置字体和大小
提示:一般来说set_xticklabels是对set_xticks的补充,如果画的图的x轴是数字,要先用set_xticks再用set_xticklabels,如果画的x轴是字符串,可以直接用set_xticklabels
6.ax.set_yticks() # 与xticks类似
7.ax.set_yticklabels() # 与xticklabels类似
8.ax.set_xlabel()/set_ylabel() # 依旧可以加font={}
9.ax.set_title() # 可以设置标题是什么,后面可以加font={}
10.ax.get_yaxis().set_visible(False) # 表示不显示y轴
11.ax.yaxis.set_label_position("left") # 表示将y轴放到左边
12.ax.set_xlim()/set_ylim() # 可以设置x轴和y轴的范围
13.ax.twinx() # 可以创建一个和ax共用x轴的子图对象【当经过多个共享x轴对象操作的时候,可以先多用twinx和twiny,之后再调整轴和标签的位置】
14.ax.text(0, 0.005, legend, transfrom=ax.transAxes, fontsize=90) # 这里举例说明,不加transform就是按照标签的大小寻找位置,如果使用了g.transAxes就是按照相对位置来找。
15.ax.set_xscale("log") # 可以把x轴变成指数变化的(与plt.xscale("log"))对应
16.ax.set_xtick(fontsize=) # 这个可以单独对ax的x轴进行调整大小,与plt.xtick(fontsize=)对应。(这里是xtick不是xticks)
17.ax.yaxis.tick_right() # 可以将y轴放到右边,同理可以用tick_left()将y轴放到左边
- plt几个比较常用的函数
1.plt.legend(loc="", ) # 对当前axe绘制图例
2.plt.tight_layout() # 让多个子图之间紧密排放,用于存储之前的操作
3.plt.savefig(fname, bbox_inches="tight", dpi=400) # 这里举例了,fname是存储路径,bbox_inches="tight"表示紧密存储(多余的空白部分python自动会截取掉),dpi表示存储的图像的像素
4.plt.rcParams["font.famliy"] = "Times New Roman" # 这可以设置全局字体
5.plt.rcParams["font.size"] = 90 # 这可以设置全局字体大小
提示:更多的rcParams请参考matplotlib — Matplotlib 3.9.0 documentation
提示:plt.show()后可以存储图片,但是对于高分辨率的图片我们必须使用savefig来操作不要用plt.show()保存。
- fig的几个常用方法
1.fig.legend() # 表示直接在画布上创建图例,这样可以避免twinx的两个对象的图例重叠的问题,还有同一个子图多个对象画图的叠加问题。这里的legend参数是一个列表,里面包含了fig先后创建的axes的你想要定义的字符串名称。也可加bbox_to_anchor,其中bbox_to_anchor有了就不要loc了,bbox_to_anchor第一个参数越大越往右,第二个参数越大越往上【一定要记住它使用prop来指明字体设置的,而其他方法是用font={}来指定的】
2.fig.add_subplot(2, 3, 1) # 参数表示为栅格的行数,列数和格子号
3.fig.add_axes([0.1, 0.1, 0.1, 0.1]) # 参数分别表示左轴距离,下轴距离,宽度,高度组成的列表,其中值都是相对整个Figure对象的比例,值的范围是0-1。【左轴距离和下轴距离是按照坐标轴计算的,也就是说坐标轴上的刻度和刻度对应的文字是不计算的】
- 特殊的方法
1.fig, ax = plt.subplots(行数, 列数, figsize=, dpi= ) # 这个是一次性创建多个ax的方法,调用不同的ax可以使用例如ax[1, 2]【从0开始算,这里表示第2行第3列】
提示:如果定义的行数或者列数有一个为1,那么ax[]时不能写两个参数了,只能写一个参数
2.fig, ax = plt.subplot(行数,列数,第几个对象(从1开始)) # 它和subplots最大区别是它是一个个生成对象的。
提示:两个或者多个对象在一个子图中绘制那么后面绘制的对象会叠加到前面绘制的对象上。
举例1
根据weather.csv的数据,绘制New York 2015年7月逐日最高,最低温度及降水量图
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv(r"C:\Users\lvyih\Desktop\weather(1).csv")
date = pd.to_datetime(data.date.values)
plt.rcParams["font.family"] = "Times New Roman"
plt.rcParams["font.size"] = 15
fig, ax = plt.subplots(2, 1, figsize=(10, 12), dpi=400)
data_NewYork = data[(data.location == "New York") & (date.year == 2015) & (date.month == 7)]
temp_max = data_NewYork.temp_max
temp_min = data_NewYork.temp_min
precipitation = data_NewYork.precipitation
date_plot = [str(x) for x in range(1, 32)]
ax1 = ax[0]
ax3 = ax[1]
ax1.plot(date_plot, temp_max, color="red")
ax1.set_xlabel("2015 7 New York")
ax1.set_ylabel(r"temp max/${^\circ}$C")
ax2 = ax1.twinx()
ax2.plot(date_plot, temp_min, color="cyan")
ax2.set_ylabel(r"temp min/${^\circ}$C")
fig.legend(["temp max", "temp min"], bbox_to_anchor=(0.27, 0.98))
ax3.bar(date_plot, precipitation, label="precipitation", color="black")
ax3.set_xlabel("2015 7 New York")
ax3.set_ylabel("precipitation/mm h$^{-1}$")
ax3.legend(loc="upper left")
plt.tight_layout()
plt.savefig(r"C:\Users\lvyih\Desktop\xiaolv.jpeg")
举例2
见附件中,这是我根据热带非洲地区在TRMM卫星下的观测资料绘制的降水占比比例变化趋势,主要是为了举例说明怎么画图,其中具体细节大家可以跳过。其中duqu.xlsx为聚类分析后的索引文件,TRMM_tropical_convection_dataset.hdf为数据文件,其中的文件路径大家想要运行需要更改,最终运行的图如下: