Matplotlib实现数据可视化

发布于:2024-04-14 ⋅ 阅读:(150) ⋅ 点赞:(0)

Matplotlib是Python中应用较为广泛的绘图工具之一,首次发布于2007年。它在函数设计上参考了MATLAB,因此名字以"Mat"开头,中间的"plot"代表绘图功能,结尾的"lib"表示它是一个集合。Matplotlib支持众多图形的绘制

Matplotlib绘图流程

  1. 准备数据
  2. 添加内容
  3. 绘制图形
  4. 保存/显示

一、折线图

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()

网站公告

今日签到

点亮在社区的每一天
去签到