前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python数据分析---matplotlib可视化(堆叠柱状图-各地市)

Python数据分析---matplotlib可视化(堆叠柱状图-各地市)

原创
作者头像
MiaoGIS
修改2020-03-11 15:02:06
1.7K0
修改2020-03-11 15:02:06
举报
文章被收录于专栏:Python in AI-IOTPython in AI-IOT

偶然看到网上国家统计数据,利用Python数据分析自己做了几种图表练习。主要采用Pandas来做数据统计,matplotlib来做图表可视化。

下面图表数据来源于网络。

堆叠柱状图

代码如下:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.font_manager import FontProperties
plt.rcParams['font.family']='sans-serif'
plt.rcParams['font.sans-serif']='SimHei'
df=pd.read_excel('d:/2018-2019年空气质量均值.xlsx')
df2=pd.read_excel('d:/2018-2019年空气质量均值.xlsx',1)


regionTypes=["省辖市","市辖区"]
width = 0.35       # the width of the bars: can also be len(x) sequence

def getPlot(regionType):

    df22=df2
    if regionType=="市辖区":
        df22=df2[df2['城市名']!='济源市']

    g=df22.groupby(df22['城市名'],sort=False).sum()
    fig, ax = plt.subplots(figsize=(12,6))


    
    labels=g.index
    y1=g['2018年二氧化硫_%s'%regionType].apply(round)
    y2=g['2018年氮氧化物_%s'%regionType].apply(round)
    y3=g['2018年烟尘_%s'%regionType].apply(round)


    y21=g['2019年二氧化硫_%s'%regionType].apply(round)
    y22=g['2019年氮氧化物_%s'%regionType].apply(round)
    y23=g['2019年烟尘_%s'%regionType].apply(round)

    x = np.arange(len(labels))  # the label locations
    rects1=ax.bar(x-width/2.0, y1, width,  label='二氧化硫',color="tab:blue",linewidth=18)
    rects2=ax.bar(x-width/2.0,y2 , width,  bottom=y1,label='氮氧化物',color="tab:orange")

    rects3=ax.bar(x-width/2.0,y3 , width, bottom=y2+y1,label='烟尘',color="tab:green")


    rects11=ax.bar(x+width/2.0+0.04, y21, width,  label='二氧化硫',color="tab:blue")
    rects22=ax.bar(x+width/2.0+0.04,y22 , width,  bottom=y21,label='氮氧化物',color="tab:orange")

    rects33=ax.bar(x+width/2.0+0.04,y23 , width, bottom=y22+y21, label='烟尘',color="tab:green")


    ax.set_ylabel('吨')
    title='2018-2019年各地市排放情况(%s)'%regionType
    ax.set_title(title)
    ax.legend([rects1,rects2,rects3],['二氧化硫', '氮氧化物', '烟尘'])

    plt.xticks(x,labels, rotation=45)

    yy=np.array([y1,y2,y3])
    yy2=yy.cumsum(0)


    yyy=np.array([y21,y22,y23])
    yyy2=yyy.cumsum(0)

    fontProperties=FontProperties(size=6)
    def autolabel1(rects,rectIndex):
        """Attach a text label above each bar in *rects*, displaying its height."""
        for i,rect in enumerate(rects):
            height = (yy2[rectIndex-1][i] if rectIndex >0 else 0)+yy[rectIndex][i]/2.0
            value=yy[rectIndex][i]
            ax.annotate('{}'.format(value),
                    xy=(rect.get_x() + rect.get_width() / 2, height-200),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",fontproperties=fontProperties,
                    ha='center', va='bottom')


    def autolabel2(rects,rectIndex):
        """Attach a text label above each bar in *rects*, displaying its height."""
        for i,rect in enumerate(rects):
            height = (yyy2[rectIndex-1][i] if rectIndex >0 else 0)+yyy[rectIndex][i]/2.0
            value=yyy[rectIndex][i]
            ax.annotate('{}'.format(value),
                    xy=(rect.get_x() + rect.get_width() / 2, height-200),
                    xytext=(0, 3),  # 3 points vertical offset
                    textcoords="offset points",fontproperties=fontProperties,
                    ha='center', va='bottom')


    autolabel1(rects1,0)
    autolabel1(rects2,1)
    autolabel1(rects3,2)

    autolabel2(rects11,0)
    autolabel2(rects22,1)
    autolabel2(rects33,2)


    plt.savefig(title+'.png', dpi=200)

for regionType in regionTypes:
    print(regionType)
    getPlot(regionType)

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

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

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

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

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