目录
前言
散点图是指在回归分析中,数据点在直角坐标系平面上的分布图,散点图表示因变量随自变量而变化的大致趋势,据此可以选择合适的函数对数据点进行拟合。
用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。散点图将序列显示为一组点。值由点在图表中的位置表示。类别由图表中的不同标记表示。散点图通常用于比较跨类别的聚合数据。
散点图适用以下场景:
-
回归分析:在回归分析中,散点图用于表示因变量随自变量而变化的大致趋势,据此可以选择合适的函数对数据点进行拟合。这种图表形式可以帮助研究者或数据分析师识别变量之间的线性或非线性关系,包括正相关、负相关和无关。
-
相关性分析:通过观察散点图上数据点的分布情况,可以推断出变量间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点;如果存在某种相关性,那么大部分的数据点就会相对密集并以某种趋势呈现。
-
比较跨类别的聚合数据:散点图通常用于比较不同类别之间的聚合数据,通过颜色的变化或其他视觉元素,可以将不同组的数据点区分开来,从而比较不同组之间的差异和关系。
-
多变量关系的可视化:在散点图的基础上,可以通过添加额外的维度来展示更多的信息。例如,可以使用颜色、点的大小或形状来表示第三个变量的取值,从而在同一个图表中展示三个变量之间的关系。
-
趋势线的添加:在基本散点图的基础上,可以添加趋势线来显示变量之间的线性关系。趋势线是通过拟合数据点而得到的一条直线,用于表示变量之间的趋势和关联程度。
一、绘制散点图:
matplotlib绘制散点图主要使用pie()函数
绘制散点图代码如下:
import matplotlib.pyplot as plt
import numpy as np
# 创建数据
x = np.random.rand(50)
y = np.random.rand(50)
# 绘制散点图
plt.scatter(x, y)
plt.xlabel('X 轴')
plt.ylabel('Y 轴')
plt.title('散点图示例')
plt.show()
运行结果如下:
二、基础散点图
工作中应用散点图分析数据,通过导入外部数据进行分析绘图
例:导入外部数据:2001-2019年劳动力与就业人员数据.npz,通过散点图分析各年劳动力与就业人员数据情况。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']='simHei'
plt.rcParams['axes.unicode_minus']=False
data=np.load('2001-2019年劳动力与就业人员数据.npz',encoding='ASCII',allow_pickle=True)
columns=data['arr_0']
values=data['arr_1']
plt.figure(figsize=(9,6),dpi=1080)
plt.scatter(values[:,0],values[:,1],marker='o')
plt.xlabel('年份')
plt.ylabel('人数(万人)')
plt.ylim(70000,85000)
plt.xticks(range(2001,2020,1),labels=values[:,0])
plt.title('故事图')
plt.show()
解释代码:
-
导入必要的库:
python复制代码
import numpy as np | |
import matplotlib.pyplot as plt |
这里导入了NumPy库(通常用于数值计算)和matplotlib.pyplot库(用于绘制图形和图表)。
-
设置中文显示:
python复制代码
plt.rcParams['font.sans-serif']='simHei' | |
plt.rcParams['axes.unicode_minus']=False |
这两行代码用于设置matplotlib的参数,以确保在图表中可以正确显示中文和负号。simHei
是一种常用于显示中文的字体。
-
加载数据:
python复制代码
data=np.load('2001-2019年劳动力与就业人员数据.npz',encoding='ASCII',allow_pickle=True) |
使用NumPy的load
函数加载一个名为2001-2019年劳动力与就业人员数据.npz
的NumPy压缩文件。这个文件应该包含以pickle格式存储的数组。但是,通常.npz
文件不需要encoding
参数,因为它是二进制格式。而allow_pickle=True
是必需的,因为.npz
文件可能包含pickle对象。
-
从加载的数据中获取列名和值:
python复制代码
columns=data['arr_0'] | |
values=data['arr_1'] |
从加载的data
对象中,我们获取名为arr_0
的列名(可能是一个字符串数组)和名为arr_1
的数据值(可能是一个二维数组或类似结构)。
-
设置图形大小和分辨率:
python复制代码
plt.figure(figsize=(9,6),dpi=1080) |
这行代码设置了图形的大小(宽度为9英寸,高度为6英寸)和分辨率(每英寸1080点)。
-
绘制散点图:
python复制代码
plt.scatter(values[:,0],values[:,1],marker='o') |
使用scatter
函数绘制散点图。这里假设values[:,0]
是x轴的数据(年份),values[:,1]
是y轴的数据(人数)。每个数据点都用一个圆(由marker='o'
指定)表示。
-
设置x轴和y轴的标签:
python复制代码
plt.xlabel('年份') | |
plt.ylabel('人数(万人)') |
这两行代码分别设置了x轴和y轴的标签。
-
设置y轴的范围:
python复制代码
plt.ylim(70000,85000) |
这行代码设置了y轴的范围,从70000到85000。
-
设置x轴的刻度标签:
python复制代码
plt.xticks(range(2001,2020,1),labels=values[:,0]) |
这里似乎有一个问题。xticks
函数的第一个参数是刻度位置,第二个参数是相应的标签。但是,通常年份的标签是字符串,而不是从values[:,0]
获取的数值。您可能想要创建一个与年份数值相对应的标签列表。但在这里,它尝试将values[:,0]
作为标签使用,这可能不是您想要的。
-
设置图表的标题:
python复制代码
plt.title('故事图') |
三、小型散点图
可以理解为精确的散点图
如上述外部数据导入
得代码如下:
from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sns
plt.rcParams['font.sans-serif']='simHei'
sns.set_style({'font.sans-serif':['SimHei','Arial']})
hr =pd.read_csv('hr.csv',encoding='gbk')
data=hr.head(100)
color_map=dict(zip(data['薪资'].unique(),['b','y','r']))
for species,group in data.groupby('薪资'):plt.scatter(group['每月平均工作小时数(小时)'],group['满意度'],color=color_map[species],alpha=0.4,edgecolors=None,label=species)
plt.legend(frameon=True,title='薪资')
plt.xlabel('每月')
plt.ylabel('水平')
plt.title('平均时间')
plt.show()
解释代码:
-
导入必要的库:
python复制代码
from matplotlib import pyplot as plt | |
import pandas as pd | |
import seaborn as sns |
这三行代码分别导入了matplotlib
的pyplot
模块(用于绘图)、pandas
库(用于数据处理)和seaborn
库(用于数据可视化)。
-
设置字体样式:
python复制代码
plt.rcParams['font.sans-serif']='simHei' | |
sns.set_style({'font.sans-serif':['SimHei','Arial']}) |
这两行代码用于设置图表中的字体样式,确保中文字符能够正确显示。simHei
和SimHei
是支持中文显示的字体。
-
读取数据:
python复制代码
hr = pd.read_csv('hr.csv',encoding='gbk') |
使用pandas
的read_csv
函数读取名为hr.csv
的CSV文件,并指定编码为gbk
(通常用于处理包含中文字符的CSV文件)。
-
选择部分数据:
python复制代码
data = hr.head(100) |
从读取的hr
数据集中选择前100行数据。
-
定义颜色映射:
python复制代码
color_map = dict(zip(data['薪资'].unique(), ['b', 'y', 'r'])) |
这里假设薪资
列包含几个不同的薪资水平。unique()
方法用于获取该列中所有唯一的薪资值,然后使用zip
函数将这些薪资值与颜色(蓝、黄、红)组合成一个字典。但是,这里有一个潜在的问题:如果薪资
列中有超过三种不同的薪资水平,则只有前三种会被映射到颜色上,其他薪资水平将不会被显示。
-
绘制散点图:
python复制代码
for species, group in data.groupby('薪资'): | |
plt.scatter(group['每月平均工作小时数(小时)'], group['满意度'], color=color_map[species], alpha=0.4, edgecolors=None, label=species) |
使用groupby
方法按薪资
列对数据进行分组,并为每个薪资组绘制一个散点图。散点图的x轴是每月平均工作小时数(小时)
,y轴是满意度
。每个薪资组都使用color_map
字典中指定的颜色进行绘制。alpha
参数用于设置点的透明度,edgecolors=None
表示不绘制点的边缘。
-
添加图例:
python复制代码
plt.legend(frameon=True, title='薪资') |
为图表添加一个图例,其中frameon=True
表示图例有一个框,title='薪资'
设置了图例的标题。
-
设置坐标轴标签和图表标题:
python复制代码
plt.xlabel('每月') | |
plt.ylabel('水平') | |
plt.title('平均时间') |
这里设置了x轴和y轴的标签以及图表的标题。但是,这些标签和标题可能不够准确或清晰。例如,x轴标签应该是“每月平均工作小时数”或类似的描述,y轴标签应该是“满意度”,图表标题应该更具体地描述图表的内容。
-
显示图表:
python复制代码
plt.show() |
最后,这行代码用于显示绘制的图表:
四、简单水平分类散点图
分类水平散点图(或称为分组散点图)通常用于显示不同类别或分组之间的数据点分布。在Python中,我们可以使用matplotlib
和pandas
库来创建这样的图表
工作薪资与时间简单水平散点图
代码如下:
python
import pandas as pd
import matplotlib.pyplot as plt
# 假设我们有以下数据
data = {
'薪资': ['低', '中', '高', '低', '中', '高', '低', '中', '高'],
'每月平均工作小时数(小时)': [160, 180, 200, 150, 185, 210, 170, 190, 220],
'满意度': [0.8, 0.7, 0.6, 0.9, 0.8, 0.5, 0.75, 0.65, 0.55]
}
# 将数据转换为DataFrame
df = pd.DataFrame(data)
# 设置图形大小和样式
plt.figure(figsize=(10, 6))
# 遍历薪资类别,为每个类别绘制散点图
colors = ['blue', 'orange', 'green'] # 为每个薪资类别定义颜色
for i, (name, group) in enumerate(df.groupby('薪资')):
plt.scatter(group['每月平均工作小时数(小时)'], group['满意度'], label=name, color=colors[i], alpha=0.6)
# 添加图例
plt.legend(title='薪资')
# 设置坐标轴标签和图表标题
plt.xlabel('每月平均工作小时数(小时)')
plt.ylabel('满意度')
plt.title('薪资与满意度关系图')
# 显示网格
plt.grid(True)
# 显示图表
plt.show()
解释代码如下:
-
导入必要的库:
python复制代码
import pandas as pd | |
import matplotlib.pyplot as plt |
这里导入了pandas
库(常用别名pd
)来处理数据,并导入了matplotlib.pyplot
库(常用别名plt
)来绘制图表。
2定义数据:
python复制代码
data = { | |
'薪资': ['低', '中', '高', '低', '中', '高', '低', '中', '高'], | |
'每月平均工作小时数(小时)': [160, 180, 200, 150, 185, 210, 170, 190, 220], | |
'满意度': [0.8, 0.7, 0.6, 0.9, 0.8, 0.5, 0.75, 0.65, 0.55] | |
} |
这里定义了一个字典data
,它包含了三个键:'薪资'
、'每月平均工作小时数(小时)'
和'满意度'
。每个键对应一个列表,这些列表包含了相应的数据。
3将数据转换为DataFrame:
python复制代码
df = pd.DataFrame(data) |
使用pandas
的DataFrame
构造函数将字典data
转换为DataFrame
对象df
。
4设置图形大小和样式(可选):
python复制代码
plt.figure(figsize=(10, 6)) |
使用plt.figure()
函数设置图形的大小为10x6英寸。
5绘制散点图:
python复制代码
colors = ['blue', 'orange', 'green'] # 为每个薪资类别定义颜色 | |
for i, (name, group) in enumerate(df.groupby('薪资')): | |
plt.scatter(group['每月平均工作小时数(小时)'], group['满意度'], label=name, color=colors[i], alpha=0.6) |
复制代码
* 定义一个颜色列表`colors`,为每个薪资类别指定一个颜色。 | |
* 使用`df.groupby('薪资')`按`'薪资'`列对数据进行分组。 | |
* 使用`enumerate()`函数遍历分组,其中`name`是薪资类别的名称,`group`是该类别下的数据子集。 | |
* 对于每个分组,使用`plt.scatter()`函数绘制散点图。`group['每月平均工作小时数(小时)']`和`group['满意度']`分别作为x轴和y轴的数据。`label=name`设置图例的标签,`color=colors[i]`设置散点的颜色,`alpha=0.6`设置散点的透明度。 |
6. 添加图例:
python复制代码
plt.legend(title='薪资') |
使用plt.legend()
函数添加图例,并设置图例的标题为'薪资'
。
7设置坐标轴标签和图表标题:
python复制代码
plt.xlabel('每月平均工作小时数(小时)') | |
plt.ylabel('满意度') | |
plt.title('薪资与满意度关系图') |
使用plt.xlabel()
和plt.ylabel()
函数设置x轴和y轴的标签。使用plt.title()
函数设置图表的标题。
8显示网格(可选):
python复制代码
plt.grid(True) |
使用plt.grid(True)
函数在图表上显示网格线。
9显示图表:
python复制代码
plt.show() |
使用plt.show()
函数显示图表。
总的来说,这段代码的目的是根据薪资类别绘制一个散点图,展示不同薪资水平下员工的每月平均工作小时数和满意度之间的关系。
总结
散点图用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式,有优点与缺点
(1)散点图优点:
直观表现出影响因素和预测对象之间的总体关系趋势;能通过直观醒目的图形方式,反映变量间的形态变化关系情况,以便于来模拟变量之间的关系
(2)散点图缺点:
散点图看上去比较乱,基本上只能看相关、分布和聚合,其他信息均不能很好展现。散点图需要有足够多的数据点,并且数据之间有相关性时才能呈现很好的结果。