Matplotlib是Python中应用较为广泛的绘图工具之一,首次发布于2007年。它在函数设计上参考了MATLAB,因此名字以"Mat"开头,中间的"plot"代表绘图功能,结尾的"lib"表示它是一个集合。Matplotlib支持众多图形的绘制。
Matplotlib绘图流程:
- 准备数据
- 添加内容
- 绘制图形
- 保存/显示
一、折线图
1、实现AQI走势折线图
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文格式
plt.rcParams['axes.unicode_minus'] = False
# 1、准备数据
data = np.loadtxt('../数据集/aqi_new.csv', delimiter=',', skiprows=1)
x = data[:31, 2] # 日期
y = data[:31, -1] # AQI
# 2、添加内容
plt.title("2017年1月份AQI走势图")
plt.xlabel("日期")
plt.ylabel("AQI的值")
x_label = [str(int(i)) for i in x] # 设置x轴名称
plt.xticks(x, x_label) # 设置x轴对应的刻度名称
# 3、绘制图形
plt.plot(x,y,c='red')
# 4、显示图形
plt.show()
常用标签和图形设置函数:
函数名 | 描述 |
---|---|
plt.title("标题内容") | 添加标题,可以指定标题名称、位置、颜色、字体大小等 |
plt.xlabel("名称") | 添加X轴名称 |
plt.ylabel("名称") | 添加Y轴名称 |
plt.xlim(left,right) | 指定当前图形X轴的范围,即确定一个数值区间 |
plt.ylim(left,right) | 指定当前图形Y轴的范围,即确定一个数值区间 |
plt.xticks(ticks,labels,rotation) | 获取或设置X轴的当前刻度位置和标签。ticks:刻度值,列表型。labels:放置在给定刻度线位置的标签。rotation:倾斜角度。 |
plt.yticks(ticks,labels) | 获取或设置Y轴的当前刻度位置和标签 |
plt.legend(title,loc) | 显示 图例。title:图例添加标题,列表型。loc:图例的位置,可以设置为'beast','upper right','upper left','lower left','lower right','right','center left','center right','lower center','upper center','center' |
plt.grid() | 显示网格线 |
plt.savefig() | 保存为图片 |
2、图形的优化和美化
plot()函数的常用参数:
plot(*args, scalex=True, scaley=True, data=None, **kwargs)
参数 | 描述 |
---|---|
*args | 一个可变位置参数 |
**kwargs | 一个可变长关键字参数。下面的x、y、fmt、c/color都属于可变长参数 |
x,y | X轴和Y轴对应的数据。数组或列表 |
fmt | 一个格式字符串 |
c/color | 设置颜色 |
w | 设置线宽 |
fmt是一种格式字符串,由颜色、标记和线型三部分组成:
fmt = '[color][market][line]'
常用颜色符号:
字符 | 描述 | 字符 | 描述 | 字符 | 描述 | 字符 | 描述 |
---|---|---|---|---|---|---|---|
'b' | 蓝色 | 'r' | 红色 | 'm' | 品红 | 'k' | 黑色 |
'g' | 绿色 | 'c' | 青色 | 'y' | 黄色 | 'w' | 白色 |
常用标记符号:
字符 | 描述 | 字符 | 描述 | 字符 | 描述 | 字符 | 描述 |
---|---|---|---|---|---|---|---|
'.' | 点 | '4' | 右箭头 | 'H' | 六边形2 | '_' | 标记线 |
',' | 像素 | 's' | 正方形 | '+' | 加号 | 'v' | 下三角 |
'o' | 圆圈 | 'p' | 五边形 | 'x' | X号 | '^' | 上三角 |
'1' | 下箭头 | 'P' | 加号 | 'D' | 菱形 | '<' | 左三角 |
'2' | 上箭头 | '*' | 星号 | 'd' | 小菱形 | '>' | 右三角 |
'3' | 左箭头 | 'h' | 六边形1 | '|' | 垂直线 |
常用线型符号:
字符 | 描述 | 字符 | 描述 |
---|---|---|---|
'-' | 实线 | '-.' | 点画线 |
'--' | 长虚线 | ':' | 短虚线 |
# 红色长虚线,数据使用星号标记:
plt.plot(x,y,"m--*")
# 黑色点画线,数据使用五边形标记:
plt.plot(x,y,"k-.D")
# 蓝色短虚线,无数据标记
plt.plot(x,y,"b:") # 颜色,线型和标记都是可选项
3、添加注释
使用matplotlib.pyplot.annotate()函数可实现添加注释:
matplotlib.pyplot.annotate(text, xy, *args,**kwargs)
annotate()函数常用参数:
参数 | 描述 |
---|---|
text | 注释的文本,字符串型 |
xy | 要注释的点,元组型,(x轴,y轴) |
xytext | 注释文本所在的位置,元组型,(x轴,y 轴) |
arrowprops | 设置在xy和xytext之间绘制箭头的样式,可选,字典型,可设置以下特征:width:箭头宽度。headwidth:箭头底部宽度。headlength:箭头长度。facecolor:填充颜色。edgecolor:边框颜色。 |
# 使用箭头标注最小值所在位置:
index = np.argmin(y) # 获取y中最小值所对应的索引
plt.annotate(text='最小值', # 注释的文本
xy=(x[index], y[index]),
xytext=(x[index], y[index] + 50),
color='red', # 文字颜色
arrowprops=dict(facecolor='g', # 填充颜色
headlength=10, # 箭头长度
headwidth=10, # 箭头底部宽度
width=2, # 箭头宽度
edgecolor='g', # 边框颜色
)
)
如果只是设置注释文本,可以使用matplotlib.pylot.text()函数实现:
matplotlib.pylot.text(x, y, s, fontdict=None, **kwargs)
text()函数的常用参数:
参数 | 描述 |
---|---|
x,y | 放置文本的位置 |
s | 文本内容 |
color | 文本颜色 |
fontdict | 设置文字属性,字典型。设置的属性主要有以下几种:fontsize:文字大小。fontstyle:文字样式,可设置为'normal','italic','oblique'。fontfamily:字体,可设为字体名称、'serif','sans-serif','cursive','fantasy','monospace'。alpha:透明度,0~1的小数。rotation:文字的旋转角度,可设为数值、'vertical','horizontal' |
plt.text(12,350,"这是通过text设置的文字",
color='red',
fontdict={
"fontsize":15, # 文字大小
"fontfamily":"sans-serif", # 字体
"alpha":0.5 # 透明度
"rotation":15 # 倾斜15度
})
二、条形图
1、条形图
import numpy as np
import matplotlib.pyplot as plt
# 设置中文格式
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文格式
plt.rcParams['axes.unicode_minus'] = False
# 1、读取数据
data = np.loadtxt('../数据集/aqi_new.csv',delimiter=',',dtype=float,skiprows=1)
x = np.arange(1,21) # 日期1-22
y = data[:20,3] # PM2.5
# 2、添加内容
plt.title("2017年1月份(前20天)AQI走势图") # 设置标题
plt.xlabel("日期") # 设置X轴名称
plt.ylabel("PM2.5的值") # 设置Y轴名称
# 3、绘制图形
x_label = [str(int(i)) for i in x] # 设置x轴刻度标签
plt.bar(x,y, # X,Y轴坐标值
facecolor="g", # 条形框的填充色
edgecolor="b", # 条形框的边框色
align="center", # 条形框与X轴刻度的对齐方式
tick_label=x_label, # 显示在X轴刻度上的文字
alpha=0.6 # 透明度
)
# 4、显示图形
plt.show()
matplotlib.pyplot.bar()函数可以实现条形图的绘制:
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center',data=None, **kwargs)
bar()函数的常用参数:
参数 | 描述 |
---|---|
x,height | X轴和Y轴对应的数据 |
width | 条形框的宽度,默认值为0.8 |
align | 设置条形框与刻度线的对齐方式,默认为'center'。'center':条形图中央与刻度线对齐。'edge':条形图左边缘与刻度线对齐 |
facecolor | 填充颜色 |
edgecolor | 边框颜色 |
tick_label | 设置与X轴刻度对应的文字,默认使用数字标签 |
2、堆叠条形图
import numpy as np
import matplotlib.pyplot as plt
# 设置中文格式
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文格式
plt.rcParams['axes.unicode_minus'] = False
# 1、读取数据
data = np.loadtxt('../数据集/aqi_new.csv',delimiter=',',dtype=float,skiprows=1)
x = np.arange(1,21) # 日期1-22
pm25_1 = data[:20,3] # 1月份PM2.5
pm25_2 = data[32:52,3] # 2月份PM2.5
# 2、添加内容
plt.title("2017年1月份和2月份前20天PM2.5比较") # 设置标题
plt.xlabel("日期") # 设置X轴名称
plt.ylabel("PM2.5的值") # 设置Y轴名称
x_label = [str(int(i)) for i in x] # 设置x轴刻度标签
plt.xticks(x,x_label,rotation=45) # 设置X轴的位置、刻度线和倾斜度
# 3、绘制图形
plt.bar(x,pm25_1,color='r',alpha=0.6)
plt.bar(x,pm25_2,color='g',alpha=0.6)
plt.legend(['1月份','2月份'])
# 4、展示图形
plt.show()
需要注意的是,plt.legend()一定要在绘制图形代码的后面,否则无法显示
3、并排条形图
import numpy as np
import matplotlib.pyplot as plt
# 设置中文格式
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文格式
plt.rcParams['axes.unicode_minus'] = False
# 1、读取数据
data = np.loadtxt('../数据集/aqi_new.csv',delimiter=',',dtype=float,skiprows=1)
bw = 0.3 # 设置条形框的宽度
x=np.arange(1,21) # 日期1-20
x2=x+bw # 设置PM10的条形图的位置
pm25 = data[:20,3] # 1月份PM2.5
pm10 = data[:20,4] # 1月份PM10
# 2、添加内容
plt.title("2017年1月份前20天PM2.5和PM10比较") # 设置标题
plt.xlabel("日期") # 设置X轴名称
plt.ylabel("PM2.5或PM10的值") # 设置Y轴名称
x_label = [str(int(i)) for i in x] # 设置x轴刻度标签
plt.xticks(x+bw/2,x_label,rotation=45) # 设置x轴刻度和刻度标签
# 3、绘制图形
plt.bar(x,pm25,color='r',width=bw)
plt.bar(x2,pm10,color='g',width=bw)
plt.legend(['PM2.5','PM10'])
# 4、展示图形
plt.show()
三、散点图
scatter()函数实现散点图:
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,vmin=None, vmax=None, alpha=None, linewidths=None, *,edgecolors=None, plotnonfinite=False, data=None, **kwargs)
scatter()函数的常用参数:
参数 | 描述 |
---|---|
x,y | X轴和Y轴对应的数据 |
s | 指定点的大小 |
c | 设置颜色 |
market | 绘制的点的形状 |
alpha | 点的透明度,取值为0-1的小数 |
import matplotlib.pyplot as plt
import numpy as np
# 设置中文格式
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文格式
plt.rcParams['axes.unicode_minus'] = False
# 准备数据
data = np.loadtxt('../数据集/aqi_new.csv', delimiter=',', skiprows=1)
# 1、准备数据
aqi = data[:366,-1]
pm25 = data[:366,3]
pm10 = data[:366,4]
# 2。添加内容
plt.title("2017年PM2.5、PM10与AQI关系散点图")
plt.xlabel("各指标值")
plt.ylabel("AQI的值")
# 3、绘制图形
plt.scatter(pm25,aqi,c='r',marker='*')
plt.scatter(pm10,aqi,c='g',marker='o')
plt.legend(['PM2.5','PM10'])
# 4、显示图形
plt.show()
四、子图
子图是将画布切割为多个网格区域,每个区域独立展示图形的格式。子图可以同时展示多个图形,并能清晰、直观地比较图形之间的差异。
import matplotlib.pyplot as plt
import numpy as np
# 设置中文格式
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文格式
plt.rcParams['axes.unicode_minus'] = False
# 1、准备数据
data = np.loadtxt('../数据集/aqi_new.csv', delimiter=',', skiprows=1)
aqi = data[:200, -1]
pm25 = data[:200, 3]
pm10 = data[:200, 4]
SO2 = data[:200, 5]
NO2 = data[:200, 6]
CO = data[:200, 7]
O3 = data[:200, 8]
# 2、绘制子图
plt.figure(figsize=(12, 10)) # 创建图形,figsize用于设置图形宽和高,单位为英寸
# 子图1
plt.subplot(221) # 子图位置在2*2网格中的第一格
plt.title("PM2.5、PM10与AQI关系散点图")
plt.scatter(pm25,aqi,c='r',marker='*')
plt.scatter(pm10,aqi,c='g',marker='o')
plt.legend(['PM2.5','PM10'])
# 子图2
plt.subplot(222)
plt.title("SO2、NO2与AQI关系散点图")
plt.scatter(SO2,aqi,c='r',marker='*')
plt.scatter(NO2,aqi,c='g',marker='o')
plt.legend(['SO2','NO2'])
# 子图3
plt.subplot(2,2,3)
plt.title("CO与AQI关系散点图")
plt.scatter(CO,aqi,c='r',marker='*')
# 子图4
plt.subplot(2,2,4)
plt.title("O3与AQI关系散点图")
plt.scatter(O3,aqi,c='r',marker='*')
plt.show()
五、饼图
使用matplotlib.pyplot.pie()函数实现饼图的绘制:
matplotlib.pyplot.pie(
x, explode=None, labels=None, colors=None, autopct=None,
pctdistance=0.6, shadow=False, labeldistance=1.1,
startangle=0, radius=1, counterclock=True, wedgeprops=None,
textprops=None, center=(0, 0), frame=False,
rotatelabels=False, *, normalize=True, hatch=None, data=None)
pie()函数的常用参数:
参数 | 描述 |
---|---|
x | 绘制“饼”的数据,array型 |
explode | 脱离圆心的幅度,取值范围0-1,1表示完全脱离 |
labels | 指定每一项的名称,array型 |
colors | 指定每一项的颜色,string型或array型,默认为None |
autopct | 数值的显示方式,string型,默认为None |
shadow | 是否显示阴影效果,默认为False |
startangle | 逆时针的旋转角度,float型,默认为0 |
radius | 指定饼图的半径,float型,默认值为1 |
import matplotlib.pyplot as plt
import numpy as np
# 设置中文格式
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据
data = np.loadtxt('../数据集/aqi_new.csv', delimiter=',', skiprows=1)
aqi = data[:366,-1]
l1 = len(aqi[aqi<=50]) # 优
l2 = len(aqi[np.logical_and(aqi>50,aqi<=100)]) # 良
l3 = len(aqi[np.logical_and(aqi>100,aqi<=150)]) # 轻度污染
l4 = len(aqi[np.logical_and(aqi>150,aqi<=200)]) # 中度污染
l5 = len(aqi[np.logical_and(aqi>200,aqi<=300)]) # 重度污染
l6 = len(aqi[aqi>300]) # 严重污染
# 绘制图形
plt.title('2017年空气质量占比图')
plt.pie(
x=[l1,l2,l3,l4,l5,l6],
explode=[0,0,0,0,0,0.1],
labels=['优','良','轻度污染','中度污染','重度污染','严重污染'],
colors=['b','g','r','c','m','y'],
autopct="%1.1f%%",
shadow=True
)
plt.show()