Python画条形图

阅读 533 标签:python  

水平方向的条形图非常适合阅读,因为文字的方向通常也是水平的,这符合我们的阅读习惯,有利于提高信息传递的效率,特别是当类别名称很长的时候。

在这张图中,2017 年的数据统一用浅灰色表示,对于 2018年的数据,用橙色代表明显上升,用蓝色代表明显下降,用灰色代表变化不大,以便观众快速抓住重点信息。

数据如下:

city	2017	2018
郑州	109.0588441	103.8498553
洛阳	108.3879049	96.11370227
安阳	119.9370629	111.4088271
开封	102.0519935	103.3918575
焦作	110.6428155	104.0422263
平顶山	99.82810861	97.52089372
信阳	81.04229783	82.2087859
周口	94.27677427	96.7151975
鹤壁	99.83663482	91.96445355
新乡	99.7822186	95.88498789
濮阳	104.1256264	99.10376559
许昌	97.34995921	101.8785931
漯河	97.06968885	98.20725389
南阳	90.0766721	92.08638554
商丘	98.0355395	97.7742871
驻马店	91.04382795	92.77177973
三门峡	96.62529138	96.96137547


代码如下:

# 导入所需的库
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/aqi.xlsx'
# 读取 Excel文件
df = pd.read_excel(filepath, index_col='city')
# 定义画图用的数据
category_names = df.index
labels = df.columns
data = df.values
# 使用「面向对象」的方法画图,定义图片的大小
fig, ax=plt.subplots(figsize=(6, 12))
# 设置背景颜色
fig.set_facecolor('w')
ax.set_facecolor('w')
# 设置标题
ax.text(0, -1, '\n2017-2018年河南省各地市AQI对比', fontsize=20, ha='left', color=c['深灰色'])
# 倒转 Y 轴,让第一个功能排在最上面
ax.invert_yaxis()
# 定义条形图所处的位置和高度
x = np.arange(len(category_names))
changes=data[:,1]-data[:,0]
# 定义颜色
def colorFunc(v):
    color=c['灰色']
    if(np.abs(v)>3):
        color=c['浅橙色'] if v >0    else c['浅蓝色']
    return color
category_colors=[colorFunc(v) for v in changes]
height = 0.35
# 画条形图
bar1 = ax.barh(x-height/2, data[:, 0], height, label=labels[0], color=c['浅灰色'])
bar2 = ax.barh(x+height/2, data[:, 1], height, label=labels[1], color=category_colors)
# 设置 Y 轴标签字体大小和颜色
plt.yticks(range(len(category_names)), ' ' + category_names, ha='right', color=c['深灰色'], size=18)
# 设置标签的字体大小
fontsize = 12
# 设置第一个条形图的数据标签
for rect in  bar1:
    w = rect.get_width()
    ax.text(0, rect.get_y()+rect.get_height()/2, labels[0], ha='left', va='center', color=c['灰色'], fontsize=fontsize)
    ax.text(w, rect.get_y()+rect.get_height()/2, ' %.2f' % w, ha='left', va='center', color=c['深灰色'], fontsize=fontsize)
    
# 设置第二个条形图的数据标签
for rect in bar2:
    w = rect.get_width()
    ax.text(0, rect.get_y()+rect.get_height()/2, labels[1], ha='left', va='center', color=c['浅灰色'], fontsize=fontsize)
    ax.text(w, rect.get_y()+rect.get_height()/2, ' %.2f' % w, ha='left', va='center', color=c['深灰色'], fontsize=fontsize)
    
# 隐藏 X 轴
ax.xaxis.set_visible(False)
# 隐藏边框
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)
plt.margins(y=0.05)
plt.show()


文章来源:网络 版权归原作者所有,如涉及知识产权问题,请权利人联系我们,我们将立即处理.
标签: python
专栏:   python
梦在深巷
文章 21 获得 0个赞 共 0个粉丝

推荐阅读 更多精彩内容