最近阅读学习了林骥老师的《数据化分析 Python 实战》,书中讲好的技能应该刻意的练习,而不是简单的重复。
学习林骥老师的数据可视化的每种图表时,原来代码略微修改,使其适用于自己工作业务中的数据可视化。
林骥老师将数据可视化分析源代码分享在他的GitHub空间https://github.com/linjiwx/mp
斜率图,可以快速展现两组数据之间各维度的变化,特别适合用于对比两个时间点的数据。
斜率图的优势,是能快速看到每个类别前后发生的变化,并能根据线条的陡峭程度,直观地感受到变化的幅度。
数据如下:
代码语言:text复制year PM2.5 PM10 SO2 NO2 O3 CO
2017 72.17396877 132.7863806 21.47354929 54.11512468 65.71172221 1.205715451
2018 56.83333333 125.75 19.125 65.45833333 30.29166667 0.92375
代码如下:
代码语言:python代码运行次数:2复制# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})
# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False
# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
'灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
'橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}
# 数据源路径
filepath='./data/air.xlsx'
df = pd.read_excel(filepath,0, index_col='year',dtype=np.float16)
category_names = df.columns
labels = df.index.map(str).to_list()
data = df.values
fig, axes=plt.subplots(2,3,figsize=(4, 6))
fig.set_facecolor('w')
axes=axes.flatten()
# 画斜率图
radio=((data[1]-data[0])/data[0]).round(2)
for i, ax,name in zip(np.arange(len(df.columns)), axes,df.columns):
ax.set_facecolor('w')
ax.set_title('n郑州市2017-2018年空气污染因子' name '对比n', fontsize=16, color=c['深灰色'])
color=c['深灰色']
if(np.abs(radio[i])>0.20):
color=c['橙色'] if(radio[i])>0 else c['蓝色']
ax.plot(labels, df.iloc[:, i], marker='o', color=color)
trend='加重' if(radio[i]>0) else '减轻'
ax.margins(y=0.2)
# 设置数据标签及其文字颜色
ax.text(-0.03, df.iloc[0, i], '{:.2f}'.format(df.iloc[0, i]), ha='right', va='center', color=color, fontsize=16)
ax.text(1.06, df.iloc[1, i], '{:.2f}'.format(df.iloc[1, i]), ha='left', va='center', color=color, fontsize=16)
ax.text(0.5, df.iloc[1, i], trend '{:.0%}'.format(np.abs(radio[i])), ha='left', va='center', color=color, fontsize=16)
ax.set_ylim(0, df.iloc[:, i].max()*1.20)
ax.yaxis.set_visible(False)
ax.xaxis.set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['bottom'].set_visible(False)
fig.tight_layout()
plt.show()