matplotlib绘图散点图、折线图
前言
数据分析中最常用的两种图形是散点图和折线图,这两种图形都能够分析不同数值型特征间的关系。其中,散点图主要用于分析特征间的相关关系,折线图用于分析自变量特征和因变量特征之间的趋势关系。
1 绘制散点图
散点图可以提供两类关键信息
- 特征之间是否存在数值或者数量的关联趋势,关联趋势是线性的还是非线性的。
- 如果一个点或者某几个点偏离大多数点,则这些点就是离群值,通过散点图可以一目了然,从而可以进一步分析这些离群值是否在建模分析中产生很大的影响。
散点图通过散点的疏密程度和变化趋势表示两个特征的数量关系。如果有3个特征,若其中一个特征为类别型,散点图改变不同特征的点的形状或者颜色,即可了解两个数值型特征和这个类别型之间的关系。
pyplot中绘制散点图的函数为scatter,函数形式如下:
matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,verts=None,edgecolors=None,hold=None,data=None,**kwargs)
常用参数说明如下
参数 | 说明 |
---|---|
x,y | 接收array。表示x轴和y轴对应的数据,无默认 |
s | 接收数值或者一维的array。指定点的大小,若传入一维array,则表示每个点的大小。默认为None |
c | 接收颜色或者一维的array。指定点的颜色,若传入一维array,则表示每个点的颜色。默认为None |
marker | 接收特定string。表示绘制的点的类型,默认为None |
alpha | 接收0——1的小数。表示点的透明度,默认为None |
绘制2000——2017个季度国民生产总值的散点图
- 数据展示:
data.files
输出:
columns = data['columns']
columns
输出:
values = data['values']
values
输出:
- 绘制
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' ## 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
data = np.load('C:/Users/Lenovo/jupyter/data/国民经济核算季度数据.npz',allow_pickle=True)
name = data['columns'] ## 提取其中的columns数组,视为数据的标签
values = data['values']## 提取其中的values数组,数据的存在位置
plt.figure(figsize=(8,7))## 设置画布
plt.scatter(values[:,0],values[:,2], marker='o')## 绘制散点图
plt.xlabel('年份')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加y轴名称
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000-2017年季度生产总值散点图')## 添加图表标题
plt.savefig('C:/Users/Lenovo/jupyter/pic/2000-2017年季度生产总值散点图.png')
plt.show()
输出:
使用不同颜色、不同形状的点,绘制2000——2017各产业个季度国民生产总值
plt.figure(figsize=(8,7))## 设置画布
## 绘制散点1
plt.scatter(values[:,0],values[:,3], marker='o',c='red')
## 绘制散点2
plt.scatter(values[:,0],values[:,4], marker='D',c='blue')
## 绘制散点3
plt.scatter(values[:,0],values[:,5], marker='v',c='yellow')
plt.xlabel('年份')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加纵轴标签
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000-2017年各产业季度生产总值散点图')## 添加图表标题
plt.legend(['第一产业','第二产业','第三产业'])## 添加图例
plt.savefig('C:/Users/Lenovo/jupyter/pic/2000-2017年季度生产总值散点图.png')
plt.show()
输出:
从上图可以看出,第一产业增长平缓,第三产业园呈现指数增长,第二产业每年会根据季度呈现周期性波动。总体来看,我国近18年的各个产业都在持续增长中。
2 绘制折线图
折线图是一种将数据点按照顺序连接起来的图形,可以看做是将散点图按照x轴坐标顺序连接起来的图形。折线图的主要功能是查看因变量Y随着自变量x改变的趋势,最适合用于显示随时间而变化的连续数据。同时还可以看出数量的差异,增长趋势的变化。
pyplot中绘制折线图的函数为plot,函数形式如下:
maplotlib.pyplot.plot(*args,**kwargs)
plot常用参数说明如下:
参数名称 | 说明 |
---|---|
x,y | 接收array。表示x轴和y轴对应的数据,无默认 |
color | 接收特定string。指定线条颜色,默认为None |
linestyle | 接收特定string。指定线条类型,默认为“-” |
marker | 接收特定string。表示绘制的点的类型,默认为None |
alpha | 接收0—1的小数,表示点的透明度,默认为None |
color参数的8种颜色的缩写如下所示:
参数缩写 | 说明 | 参数缩写 | 说明 |
---|---|---|---|
b | 蓝色 | m | 品红 |
g | 绿色 | y | 黄色 |
r | 红色 | k | 黑色 |
c | 青色 | w | 白色 |
根据上述,使用pyplot绘制2000——2017年各季度国民生产总值折线图
plt.figure(figsize=(8,7))## 设置画布
## 绘制折线图
plt.plot(values[:,0],values[:,2],color = 'r',linestyle = '--')
plt.xlabel('年份')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加y轴名称
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000-2017年季度生产总值折线图')## 添加图表标题
plt.savefig('C:/Users/Lenovo/jupyter/pic/2000-2017年季度生产总值折线图.png')
plt.show()
输出:
使用marker参数可以绘制点线图,使图形更丰富。
plt.figure(figsize=(8,7))## 设置画布
plt.plot(values[:,0],values[:,2],color = 'r',linestyle = '--',
marker = 'o')## 绘制折线图
plt.xlabel('年份')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加y轴名称
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000-2017年季度生产总值点线图')## 添加图表标题
plt.savefig('C:/Users/Lenovo/jupyter/pic/2000-2017年季度生产总值折线图.png')
plt.show()
输出:
plot函数一次可以接收多组数据,添加多条折线图,同时可以分别定义每条折线的颜色、点的形状和类型,还可以将这3个参数连接在一起,用一个字符串表示,如下所示:
绘制各产业各季度生产总值的折线散点图
plt.figure(figsize=(8,7))## 设置画布
plt.plot(values[:,0],values[:,3],'bs-',
values[:,0],values[:,4],'ro-.',
values[:,0],values[:,5],'gH--')## 绘制折线图
plt.xlabel('年份')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加y轴名称
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title('2000-2017年各产业季度生产总值折线图')## 添加图表标题
plt.legend(['第一产业','第二产业','第三产业'])
plt.savefig('C:/Users/Lenovo/jupyter/pic/2000-2017年季度各产业生产总值折线图.png')
plt.show()
3 小案例
3.1 绘制2000—2017各产业与行业的国民生产总值散点图
国民生产总值的数据包括三大产业的国民生产总值,以及农业、工业、建筑、批发、交通、餐饮、金融、房地产、和其他行业各个季度的gdp。
- 通过散点图分析三大行业的国民生产总值发现我国产业结构
- 通过比较各行业间季度的增加值则可以发现国民经济的主要贡献行业
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' ## 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
data = np.load('C:/Users/Lenovo/jupyter/data/国民经济核算季度数据.npz',allow_pickle=True)
name = data['columns']## 提取其中的columns数组,视为数据的标签
values = data['values']## 提取其中的values数组,数据的存在位置
p = plt.figure(figsize=(12,12)) ##设置画布
## 子图1
ax1 = p.add_subplot(2,1,1)
plt.scatter(values[:,0],values[:,3], marker='o',c='r')## 绘制散点
plt.scatter(values[:,0],values[:,4], marker='D',c='b')## 绘制散点
plt.scatter(values[:,0],values[:,5], marker='v',c='y')## 绘制散点
plt.ylabel('生产总值(亿元)')## 添加纵轴标签
plt.title('2000-2017年各产业季度生产总值散点图')## 添加图表标题
plt.legend(['第一产业','第二产业','第三产业'])## 添加图例
## 子图2
ax2 = p.add_subplot(2,1,2)
plt.scatter(values[:,0],values[:,6], marker='o',c='r')## 绘制散点
plt.scatter(values[:,0],values[:,7], marker='D',c='b')## 绘制散点
plt.scatter(values[:,0],values[:,8], marker='v',c='y')## 绘制散点
plt.scatter(values[:,0],values[:,9], marker='8',c='g')## 绘制散点
plt.scatter(values[:,0],values[:,10], marker='p',c='c')## 绘制散点
plt.scatter(values[:,0],values[:,11], marker='+',c='m')## 绘制散点
plt.scatter(values[:,0],values[:,12], marker='s',c='k')## 绘制散点
## 绘制散点
plt.scatter(values[:,0],values[:,13], marker='*',c='purple')
## 绘制散点
plt.scatter(values[:,0],values[:,14], marker='d',c='brown')
plt.legend(['农业','工业','建筑','批发','交通',
'餐饮','金融','房地产','其他'])
plt.xlabel('年份')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加纵轴标签
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.savefig('C:/Users/Lenovo/jupyter/pic/2000-2017年季度各行业生产总值散点子图.png')
plt.show()
输出:
上图可以看出,我国现阶段国民经济增长的主要动力是第三产业,其次是第二产业。从行业看,工业、其他行业和农业对整体国民经济贡献度最大。
3.2 绘制2000—2017年各产业与行业的国民生产总值折线图
通过绘制2000—2017年各产业与行业的国民生产总值折线图,可以发现我国经济各产业与各行业增长趋势
p1 = plt.figure(figsize=(8,7))## 设置画布
## 子图1
ax3 = p1.add_subplot(2,1,1)
plt.plot(values[:,0],values[:,3],'b-',
values[:,0],values[:,4],'r-.',
values[:,0],values[:,5],'g--')## 绘制折线图
plt.ylabel('生产总值(亿元)')## 添加纵轴标签
plt.title('2000-2017年各产业季度生产总值折线图')## 添加图表标题
plt.legend(['第一产业','第二产业','第三产业'])## 添加图例
## 子图2
ax4 = p1.add_subplot(2,1,2)
plt.plot(values[:,0],values[:,6], 'r-',## 绘制折线图
values[:,0],values[:,7], 'b-.',## 绘制折线图
values[:,0],values[:,8],'y--',## 绘制折线图
values[:,0],values[:,9], 'g:',## 绘制折线图
values[:,0],values[:,10], 'c-',## 绘制折线图
values[:,0],values[:,11], 'm-.',## 绘制折线图
values[:,0],values[:,12], 'k--',## 绘制折线图
values[:,0],values[:,13], 'r:',## 绘制折线图
values[:,0],values[:,14], 'b-')## 绘制折线图
plt.legend(['农业','工业','建筑','批发','交通',
'餐饮','金融','房地产','其他'])
plt.xlabel('年份')## 添加横轴标签
plt.ylabel('生产总值(亿元)')## 添加纵轴标签
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.savefig('C:/Users/Lenovo/jupyter/pic/2000-2017年季度各行业生产总值折线子图.png')
plt.show()
输出:
上图可以看出,我国整体经济呈现增长趋势,第一产业增长相对较慢,但周期性最明显,农业的周期性和第一产业的周期性基本吻合。工业和第二产业的增长趋势基本一致。同时,除餐饮行业外,其他行业均呈现较为明显的增长趋势。