Python数据分析--堆叠图

2022-04-24 15:07:56 浏览数 (1)

最近阅读学习了林骥老师的《数据化分析 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()

0 人点赞