最近阅读学习了林骥老师的《数据化分析 Python 实战》,书中讲好的技能应该刻意的练习,而不是简单的重复。
学习林骥老师的数据可视化的每种图表时,原来代码略微修改,使其适用于自己工作业务中的数据可视化。
林骥老师将数据可视化分析源代码分享在他的GitHub空间https://github.com/linjiwx/mp
堆叠条形图,用于展示不同类别之间占比数据,常常能起到很好的对比效果。
数据如下:
代码语言:text复制date level1 level2 level3
201701 0 8 23
201702 0 6 22
201703 0 15 16
201704 0 15 15
201705 1 10 20
201706 1 18 11
201707 2 27 2
201708 4 25 2
201709 3 20 7
201710 8 15 8
201711 0 16 14
201712 1 15 15
代码如下:
代码语言:python代码运行次数:0复制# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from datetime import timedelta
# 正常显示中文标签
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/aqi.xlsx'
# 读取 Excel文件
df = pd.read_excel(filepath, index_col='date')
df.index=df.index.map(lambda x:'%d月'%int(str(x)[-2:]))
df.rename(columns={'level1':'优','level2':'良','level3':'差'},inplace=True)
# 定义画图用的数据
category_names = df.columns
labels = df.index
data = df.values
data_cum = data.cumsum(axis=1)
# 使用「面向对象」的方法画图,定义图片的大小
fig, ax=plt.subplots(figsize=(9, 5))
# 设置标题
ax.set_title('n2017年郑州市各月空气质量分布nn', fontsize=26, loc='left', color=c['深灰色'])
# 倒转 Y 轴,让第一个功能排在最上面
ax.invert_yaxis()
# 隐藏 X 轴
ax.xaxis.set_visible(False)
# 设置 X 轴的范围
ax.set_xlim(0, np.sum(data, axis=1).max())
# 定义颜色
category_colors = [ c['蓝色'], c['浅蓝色'], c['浅橙色']]
# 画堆叠水平条形图
for i, (colname, color) in enumerate(zip(category_names, category_colors)):
widths = data[:, i]
starts = data_cum[:, i] - widths
ax.barh(labels, widths, left=starts, height=0.68, label=colname, color=color, edgecolor='w')
xcenters = starts widths / 2
# 设置数据标签及其文字颜色
color='w' if i <2 else c['深灰色']
for y, (x, d) in enumerate(zip(xcenters, widths)):
if(d>0):
ax.text(x, y, '{:d}'.format(d), ha='center', va='center', color=color, fontsize=12)
# 显示图例
l = ax.legend(ncol=len(category_names), bbox_to_anchor=(-0.03, 0.95),loc='lower left',
fontsize=16, frameon=False, handlelength=0.6)
for i,ll in enumerate(l.get_texts()):
ll.set_color(category_colors[i])
# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)
# 隐藏 Y 轴的刻度线
ax.tick_params(axis='y', which='major', length=0)
# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=16, colors=c['深灰色'])
plt.show()