前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python数据分析--堆叠图

Python数据分析--堆叠图

原创
作者头像
MiaoGIS
发布2022-04-24 15:07:56
9670
发布2022-04-24 15:07:56
举报
文章被收录于专栏:Python in AI-IOTPython in AI-IOT

最近阅读学习了林骥老师的《数据化分析 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
复制
# 导入所需的库
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年郑州市各月空气质量分布\n\n', 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()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档