ISEE小语
丰子恺曾说:“心小了,所有的小事就大了;心大了,所有的大事都小了。”
当遇到困境的时候,当有想不开的那刻,不妨去外面看看。
回顾上篇
Pandas处理数据增、删、改、查,日常使用小结,清晰版
ISEE小栈,公众号:ISEE小栈Pandas处理数据增、删、改、查,日常使用小结,清晰版
开始本篇
在pandas中,matplotlib是一个常用的数据可视化库,它可以与pandas紧密结合,提供灵活且高度定制的图形功能。
主要作用和使用场景有数据探索和分析、数据可视化、数据预处理、特征工程、数据报告和演示等。
环境:
Pycharm
Python 3.9.16
安装:
pip install pandas==2.0.0
pip install matplotlib==3.7.1
pip install scipy==1.10.1
导入:
import matplotlib.pyplot as plt
import pandas as pd
import scipy.stats as stats
1 线性图(Line Chart)
线性图是一种用于展示数据随时间或顺序变化的趋势和变化情况的图形。它通过连接数据点并沿着x轴绘制线条来显示数据的变化趋势。
它能够帮助我们观察数据的增长或下降趋势、发现周期性变化以及识别异常值等。线性图结构生成方式如下
data = {'日期': ['2023-08-02', '2023-08-03', '2023-08-04', '2023-08-05', '2023-08-06', '2023-08-07', '2023-08-08',
'2023-08-09', '2023-08-10', '2023-08-11'],
'最高温度(C)': [34, 36, 33, 35, 34, 34, 37, 35, 34, 35],
'最低温度(C)': [26, 27, 25, 26, 22, 24, 29, 23, 23, 28]}
df = pd.DataFrame(data)
# 将日期列转换为 DateTime 类型
df['日期'] = pd.to_datetime(df['日期'])
# 使用 plot() 方法绘制线性图
ax = df.plot(x='日期', y=['最高温度(C)', '最低温度(C)'], kind='line')
# 在每个数据点上显示具体数值
for column in ['最高温度(C)', '最低温度(C)']:
for i, value in enumerate(df[column]):
ax.annotate(str(value), (df['日期'][i], value), xytext=(5, -10), textcoords='offset points')
# 添加标题
plt.title('某市近十天天气情况')
# 显示图形
plt.show()
结果:
2 柱状图(Bar Chart)
柱状图是一种用于展示分类变量的数量或频率分布的图形。它通过将每个类别显示为垂直或水平的矩形条,并使用条的长度来表示对应类别的数值大小或频次。
柱状图能够帮助我们比较不同类别之间的数值差异,并提供直观的视觉对比效果。
单柱状图结构生成方式如下:
data = {'城市': ['北京', '上海', '广州', '深圳'],
'人口(万人)': [2153.6, 2427.7, 1506.8, 1383.4]}
df = pd.DataFrame(data)
# 使用plot()方法绘制块形图
ax = df.plot(x='城市', y='人口(万人)', kind='bar')
# 显示数据标签
for p in ax.patches:
ax.annotate(str(p.get_height()), (p.get_x() + p.get_width() / 2., p.get_height()), ha='center', va='center',
xytext=(0, 5), textcoords='offset points')
# 设置图形标题和坐标轴标签
plt.title('某年一线城市人口统计')
plt.xlabel('城市')
plt.ylabel('人口(万人)')
# 显示图形
plt.show()
结果:
双柱状图结构生成方式如下:
data = {'城市': ['北京', '上海', '广州', '深圳'],
'2021': [2153.6, 2427.7, 1506.8, 1383.4],
'2022': [2184.3, 2475.89, 1536.5, 1410.7]}
df = pd.DataFrame(data)
# 使用plot生成双柱状图
ax = df.plot(x='城市', y=['2021', '2022'], kind='bar', figsize=(8, 6))
# 显示数据标签
for p in ax.patches:
ax.annotate(str(p.get_height()), (p.get_x() + p.get_width() / 2., p.get_height()), ha='center', va='center',
xytext=(0, 5), textcoords='offset points')
# 设置图形的其他属性
plt.title('某年一线城市人口统计')
plt.xlabel('城市')
plt.ylabel('人口(万人)')
plt.legend(['2021', '2022'])
# 显示图形
plt.show()
结果:
3 饼状图(Pie Chart)
饼图是一种用于展示数据组成部分的相对比例的图形。它通过将数据分割成扇形区域,并根据每个数据部分的数值大小来确定扇形的大小,从而直观地显示各部分占总体的比例关系。
饼图能够直观地传达数据的相对大小和占比关系,帮助我们快速了解数据的构成情况。饼状图结构生成方式如下
data = {'城市': ['北京', '上海', '广州', '深圳'],
'人口(万人)': [2153.6, 2427.7, 1506.8, 1383.4]}
df = pd.DataFrame({'人口': data['人口(万人)']}, index=data['城市'])
df.plot.pie(y='人口', autopct='%1.1f%%')
plt.title('四大一线城市人口占比')
plt.axis('equal')
# 添加标签和图例
plt.legend(df.index, loc='best')
plt.xlabel('城市')
plt.show()
结果:
4 散点图(Scatter Plot)
散点图是一种用于展示两个变量之间关系的图形,其中每个数据点表示一个观测值,并以其在坐标轴上的位置表示两个变量的值
散点图可以帮助我们观察和分析两个变量之间的相关性、趋势和离群点等信息。结构生成方式如下:
data = {'指标': ['A', 'B', 'C', 'D'],
'值': [[0.617794866729757, 0.7261416993691233, 0.45335763675165397, 0.0645351221571896],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]]}
df = pd.DataFrame(data['值'], columns=data['指标'])
df.plot.scatter(x='A', y='B')
plt.title('指标与分布值的关系')
plt.xlabel('指标')
plt.ylabel('值')
plt.show()
结果:
5 面积图(Area Plot)
面积图是一种用于展示数据序列随时间或其他变量变化而产生的总体趋势和相对比例的图形。
它的特点是通过填充颜色来表示数据序列之间的相对大小,使得我们可以更直观地比较不同数据序列的贡献程度和变化情况
data = {'指标': ['A', 'B', 'C', 'D'],
'值': [[0.617794866729757, 0.7261416993691233, 0.45335763675165397, 0.0645351221571896],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]]}
df = pd.DataFrame(data['值'], columns=data['指标'])
df.plot.area()
plt.title('2023年指标统计')
plt.xlabel('指标')
plt.ylabel('值')
plt.show()
结果:
6 箱线图(Box Plot)
箱线图,也叫盒须图。箱线图是一种用于展示数据分布和离群值情况的图形。它通过五个统计量(最小值、第一四分位数、中位数、第三四分位数和最大值)来描述数据的位置和离散程度,并使用箱体和须状线表示。
在箱线图中,箱体表示数据的四分位数范围,而中间的线表示中位数。两条延伸出来的须状线表示数据的整体分布范围,通常将超出1.5倍四分位距的数据点视为离群值,用点状标记表示。
data = {'指标': ['A', 'B', 'C', 'D'],
'值': [[0.617794866729757, 0.7261416993691233, 0.45335763675165397, 0.0645351221571896],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]]}
df = pd.DataFrame(data['值'], columns=data['指标'])
ax = df.plot.box()
high_value = df.max().values
middle_value = df.median().values
low_value = df.min().values
for i, value in enumerate(high_value):
ax.text(i + 1, value, f'{value:.4f}', ha='center', va='bottom')
for i, value in enumerate(middle_value):
ax.text(i + 1, value, f'{value:.4f}', ha='center', va='bottom')
for i, value in enumerate(low_value):
ax.text(i + 1, value, f'{value:.4f}', ha='center', va='bottom')
# 设置图形标题
plt.title('*指数显示')
# 显示图形
plt.show()
结果:
7 直方图(Histogram)
直方图是一种用于展示连续变量的分布情况的图形。它将数据划分为多个等宽的区间(称为bin),统计每个区间中的观测值数量,并将结果以柱状图的形式显示出来。
直方图的x轴表示不同的区间,y轴表示每个区间内的观测值数量(频数或频率)。每个柱状条的高度表示该区间内的观测值数量。通过直方图,我们可以直观地了解数据的分布情况、峰值位置、偏态和尾部等信息。
# 创建示例的DataFrame
data = {'指标1': [0.5438490464235468, 1.6132013096989581, 1.2564775096514877, 0.732083712801555, -0.08684923239754738,
0.48963910035381475, 1.777015316015052, 2.231719573706167, 0.44074765698096074, 0.795655028568522],
'指标2': [0.5170581524378269, 0.3676014746716523, 0.2568163935591142, 0.7443730679123753, -0.480738938866625,
-0.46701838150429154, -0.06617100209426717, 2.9778264779781503, 0.15973574401398766,
0.7426920576169782],
'指标3': [-1.528469841797719, -1.3501809677890708, -0.14209935030147136, -0.36720393557243003,
-1.356898764510798, -0.3513492800511534, -2.0957136611568927, -0.36243152959003255,
-0.6195516203424496, -0.0843290590206679]}
df = pd.DataFrame(data, columns=data.keys())
# 使用plot()方法绘制直方图
df.plot.hist(bins=30)
# 设置图形标题和坐标轴标签
plt.title('*指数分布')
# 显示图形
plt.show()
结果:
8 填充图
Matplotlib库中通过fill_between方法绘制线条之间的填充区域,称为填充图,是一个很直观的看到分布情况的图形。
data= {'x': ['A', 'B', 'C', 'D', 'E'],
'y1': [1, 3, 2, 4, 3],
'y2': [0, -2, -1, -3, -2]}
df = pd.DataFrame(data)
# 绘制填充图
plt.fill_between(df['x'], 0, df['y1'], color='blue', alpha=.30)
plt.fill_between(df['x'], 0, df['y2'], color='red', alpha=.30)
# 设置标题和坐标轴标签
plt.title('某某活力值')
plt.xlabel('指标')
plt.ylabel('值')
# 显示图形
plt.show()
结果:
9 热力图
热力图是一种可视化工具,用于展示二维数据的颜色编码图,通过颜色的变化来表示不同位置的数值大小。热力图的作用是帮助我们直观地观察和分析数据的分布和趋势。
注意:本次使用的是Matplotlib库中的显示二维数组数据的函数imshow,还有一个能实现同样功能的是matshow方法,建议优先使用imshow,它的功能和使用广泛性比较强。
data = {'指标1': [1.5438490464235468, 2.6132013096989581, 3.2564775096514877, 4.732083712801555],
'指标2': [10.5170581524378269, 11.3676014746716523, 12.2568163935591142, 13.7443730679123753],
'指标3': [1.528469841797719, 1.3501809677890708, 0.14209935030147136, 0.36720393557243003],
'指标4': [15.5170581524378269, 16.3676014746716523, 17.2568163935591142, 18.7443730679123753]
}
df = pd.DataFrame(data)
# 绘制热力图
plt.imshow(df, cmap='hot', interpolation='bilinear', origin='lower')
# 添加颜色条
plt.colorbar()
plt.title('某某模型数值密度')
# 设置坐标轴标签
plt.xticks(range(len(df.columns)), df.columns)
plt.yticks(range(len(df.index)), df.index)
plt.xlabel('指标项')
plt.ylabel('指标值')
# 显示图形
plt.show()
结果:
10 QQ图
QQ图是一种用于检查数据是否符合某个理论分布(通常是正态分布)的图形方法。它通过绘制观测值的分位数与期望分位数之间的关系来判断数据的分布情况。
plot函数不提供直接生成QQ图的功能,我们需要使用SciPy库中的stats模块来计算期望分位数,并使用Matplotlib库来绘制QQ图。
data_ = {'指标': '某模型模拟数据',
'值': [0.617794866729757, 0.7261416993691233, 0.45335763675165397, 0.0645351221571896, 0.5133436414315576,
0.04236984256993337, 0.02032559357876973, 0.7323785043162392, 0.26377138184154436,
0.8872797711156284,
0.4470002029416369, 0.8199271553213361]}
data = pd.Series(data_['值'])
standard = [0.25, 0.5, 0.75]
quantiles = data.quantile(standard)
expected_quantiles = stats.norm.ppf(standard)
plt.scatter(expected_quantiles, quantiles)
plt.plot([min(expected_quantiles), max(expected_quantiles)],
['r--') ],
plt.xlabel('标准')
plt.ylabel('样本')
plt.title(data_['指标'])
plt.show()
结果:
总结
Pandas非常强大,本次记录日常使用的十类分析图,是继承上篇处理数据的基础上,来将数据形成图,便于更好的分析。
每个类型分析图均有独立的测试数据,可根据自己实际需求既用既取。
寄语:世间三美,明月,清风,眼前……
看到这儿的朋友帮点个“赞”和“在看”,谢谢支持~!
文章就分享到这儿,喜欢就点个赞吧!