Matplotlib绘图散点图

2022-09-14 10:15:55

Matplotlib绘图

本内容主要介绍了Matplotlib库可以绘制的图形,即实现数据可视化。
本内容仅为我个人的学习总结。

1 散点图:

散点图是利用坐标点的分布形态反映特征间的相关关系的一种图形。这里的散点图均为二维散点图,可通过点的疏密程度和变化趋势表示两特征间的关系。

个人绘图经验:

  • 使用散点图绘制的数据一般为离散型的数据
  • 可通过绘制散点图查看特征之间是否存在关联趋势,即线性还是非线性
  • 可通过绘制散点图查看是否有离群点(异常值)
  • 也可通过绘制散点图查看不同标签的特征分布情况(语言组织可能会有点混乱,下面绘图会提到)

使用语法如下:

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, yarray, 表示x轴和y轴对应的数值,无默认值
s一维的array或数值,指定点的大小,若为一维array则表示每个点的大小,默认为None
c颜色或是一维array,指定点的颜色,若为一维array则表示每个点的颜色,默认为None
marker特定的str,表示点的类型,有规定哪个字符串为哪个类型,默认为None
alpha0-1的小数,表示点的透明度,默认为None

1 简单绘制一张图表:

import matplotlib.pyplot as pltimport numpy as np# 构建数据
x= np.linspace(0, 2*np.pi,100)# [0:2π]取100个点
y= np.sin(x) + 2
y2= np.cos(x) - 2# 绘制一张图表
plt.rcParams['font.sans-serif']='SimHei'# 正常显示中文
plt.title('散点图示例1')# 添加标题
plt.xlabel('x')# 添加x轴标签
plt.ylabel('y')# 添加y轴标签
plt.scatter(x, y)# 绘制散点图
plt.legend(['y = sin(x) + 2'])# 添加图例# plt.savefig('散点图示例1.jpg') # 保存图表
plt.show()

绘图结果:
在这里插入图片描述

2 同一张图表简单绘制多个图

plt.rcParams['font.sans-serif']='SimHei'# 正常显示中文
plt.rcParams['axes.unicode_minus']= False# 正常显示负号
plt.title('散点图示例2')# 添加标题
plt.xlabel('x')# 添加x轴标签
plt.ylabel('y')# 添加y轴标签
plt.xlim(-1, 7)# 设置x轴刻度范围
plt.ylim(-4,4)# 设置y轴刻度范围
plt.scatter(x, y)# 绘制散点图
plt.scatter(x, y2)
plt.legend(['y = sin(x) + 2','y2 = cos(x) - 2'])# 添加图例# plt.savefig('散点图示例2.jpg') # 保存图表
plt.show()

结果显示:
在这里插入图片描述

3 同一个画布简单绘制两个图表

plt.rcParams['font.sans-serif']='SimHei'# 正常显示中文
plt.rcParams['axes.unicode_minus']= False# 正常显示负号

plt.subplot(2,1,1)# 将画布划分成两行一列,取第一个放第一个图表内容
plt.scatter(x, y, c='r')# 绘制散点图#对子图添加亿点点
plt.title('图1')# 添加标题
plt.xlabel('x')# 添加x轴标签
plt.ylabel('y')# 添加y轴标签
plt.xlim(-1, 7)# 设置x轴刻度范围
plt.ylim(0,4)# 设置y轴刻度范围
plt.legend(['y = sin(x) + 2'])# 添加图例

plt.subplot(2,1,2)# 将画布划分成两行一列,取第二个
plt.scatter(x, y2, c='g')#对子图添加亿点点
plt.title('图2')# 添加标题
plt.xlabel('x')# 添加x轴标签
plt.ylabel('y2')# 添加y轴标签
plt.xlim(-1, 7)# 设置x轴刻度范围
plt.ylim(-4, 0)# 设置y轴刻度范围
plt.legend(['y2 = cos(x) - 2'])# 添加图例# plt.savefig('散点图示例1.jpg') # 保存图表
plt.show()

结果显示:
在这里插入图片描述

图中的数据x和y是有一定的线性关系的,通过绘制x和y的散点图,可以很明显地看出他们之间的线性关系。

对于线性关系没有那么强的数据,也是可以通过绘制散点图查看数据大概的走向或趋势,以及对比不同数据之间走向或趋势

4 导入数据绘制一张图表

#使用scatter函数绘制2000~2017年各季度的国民生产总值散点图import matplotlib.pyplot as pltimport numpy as np 
data= np.load('H:/1-大四学习资料/python可视化/Matplotlib绘图/国民经济核算季度数据.npz',allow_pickle=True) 
name= data['columns']# 提取columns数组,视为数据的标签
values= data['values']# 提取values数组,数据的存在位置

plt.rcParams['font.sans-serif']='SimHei'# 正常显示中文
plt.rcParams['axes.unicode_minus']= False# 正常显示负号
plt.figure(figsize=(8, 7))# 设置画布大小
plt.scatter(values[: ,0], values[: , 2], marker='o')# marker='o'设置点的形状为圆形
plt.xlabel('年份')# 添加x轴标签
plt.ylabel('生产总值(亿元)')# 添加y轴标签
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation= 45)# 设置x轴刻度,rotation = 45, x轴刻度旋转45度
plt.title('2000~2017年季度生产总值散点图')#plt.savefig('../tmp/2000~2017年季度生产总值散点图.png')
plt.show()

结果显示:
在这里插入图片描述
可以看出2000~2017年季度生产总值大概呈向上的趋势发展,即人们的生产总值越来越高

5 同一个图表绘制多个图,并比较不同图之间的关系

#绘制2000~2017年第一产业、第二产业、第三产业各季度的国民生产总值散点图
plt.Figure(dpi= 80, figsize=(8, 7)) 
plt.rcParams['font.sans-serif']='SimHei'# 第一产业
y1= values[: , 3] 
plt.scatter(range(len(y1)), y1) 
plt.xticks(range(len(y1)), values[:: 4, 1], rotation= 45)# 第二产业
y2= values[: , 4] 
plt.scatter(range(len(y2)), y2) 
plt.xticks(range(len(y2)), values[:: 4, 1], rotation= 45)#第三产业
y3= values[: , 5] 
plt.scatter(range(len(y3)), y3) 
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation= 45) 

plt.title('2010~2017年各产业季度生产总值') 
plt.legend(['第一产业','第二产业','第三产业'])#plt.savefig('../tmp/三种产业散点图.png')
plt.show()

结果显示:
在这里插入图片描述
从图可以看出,三个产业在2000年-2017年期间生产总值均呈上升趋势发展。第三产业和第二产业的发展趋势比第一产业的发展趋势好,上升速度也比第一产业快。第三产业和第二产业的上升的幅度非常接近,但在近两年第三产业的生产总值比第二产业的生产总值好。

从以上两个图来看,绘制散点图可以表现特征之间是否存在数值或是数量的变化或趋势, 也可对比不同特征之间的数量变化与趋势

6 绘制散点图查看不同标签的特征分布情况

这里使用的数据是鸢尾花数据

import matplotlib.pyplot as pltimport pandas as pd
from sklearn.datasetsimport load_iris

iris= load_iris()
data= pd.DataFrame(iris.data,columns= iris.feature_names)
data['target']= iris.target
data.head()

结果显示:
在这里插入图片描述

plt.rcParams['font.sans-serif']='SimHei'#显示中文

d0= data.loc[data['target']== 0]# 提取标签为0的数据
d1= data.loc[data['target']== 1]# 提取标签为1的数据
d2= data.loc[data['target']== 2]# 提取标签为2的数据# 散点图1:x为标签为0的花萼长度;y为标签为0的花瓣长度
x0= d0['sepal length (cm)']; y0= d0['petal length (cm)']
plt.scatter(x0, y0, color='b')# 绘制,颜色为蓝色# 散点图2:x为标签为1的花萼长度;y为标签为1的花瓣长度
x1= d1['sepal length (cm)']; y1= d1['petal length (cm)']
plt.scatter(x1, y1, color='g')# 颜色为绿色# 散点图3:x为标签为2的花萼长度;y为标签为2的花瓣长度
x2= d2['sepal length (cm)']; y2= d2['petal length (cm)']
plt.scatter(x2, y2, color='r')# 颜色为红色

plt.legend(['标签为0','标签为1','标签为2'])# 添加图标
plt.xlabel('花萼长度')# 添加x轴标签
plt.ylabel('花瓣长度')# 添加y轴标签
plt.show()

结果显示:
在这里插入图片描述
可以看到不同的标签特征分布情况不一样,而且他们所在的区域不一样的,如品种0的花瓣长度是三个品种中最短的,而花萼长度主要在5.0左右,品种3的花瓣长度是3个品种最长的,花萼长度也比其他品种长。

关于颜色和大小的补充:

一般来说,绘图大小 s 默认为20,s=0时点不显示;颜色 c 默认为蓝色。

  • 大小 s 可以为一个数值,也可以是一维array
  • 颜色 c 可以是指定的str(有规定),也可是一维array

常用的颜色str指定的颜色如下:

str颜色
b蓝色
r红色
g绿色
m紫色
y黄色
c青色
k黑色
w白色

大小和颜色为一维array:

import matplotlib.pyplot as pltimport numpy as np
x=[1,2,3,4,5,6,7]
plt.scatter(x, x, s=10*np.array(x)**2, c=x)
plt.show()

结果显示:
在这里插入图片描述
在这里s = [100, 400, 900, 1600, 2500, 3600, 4900] 数值越大,点的大小就越大。
一维array的c中各数值表示的颜色,是在颜色带中按比例取得颜色。

颜色带:
在这里插入图片描述
色卡:
在这里插入图片描述
源于Matplotlib这部分,大家可以去下面这个网站查找相关内容,里面有很多资源和教程,有兴趣的小伙伴可以去看一下
Matplotlib中文网

文献参考:
[1] matplotlib中文网 https://www.matplotlib.org.cn/
[2]色卡图(他的图是真的好看,侵权删)https://www.jianshu.com/p/53ebc1c40258

  • 作者:soga_Moji
  • 原文链接:https://blog.csdn.net/weixin_46961200/article/details/109310836
    更新时间:2022-09-14 10:15:55