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

Python数据分析--柱状图

原创
作者头像
MiaoGIS
发布2022-04-22 17:37:37
8090
发布2022-04-22 17:37:37
举报
文章被收录于专栏:Python in AI-IOTPython in AI-IOT

最近阅读学习了林骥老师的《数据化分析 Python 实战》,书中讲好的技能应该刻意的练习,而不是简单的重复。

学习林骥老师的数据可视化的每种图表时,原来代码略微修改,使其适用于自己工作业务中的数据可视化

林骥老师将数据可视化分析源代码分享在他的GitHub空间https://github.com/linjiwx/mp

柱形图是一种很常见的图形,用来进行对比分析,是一种比较好的选择。

林骥老师在关于柱状图的6点建议里提到:

1、纵轴的底端要从 0 开始,避免造成误导,如果你是故意这么做的,那么有可能会影响到你的信誉;

2、柱子的宽度,不宜过窄,也不宜过宽,通常比柱子之间的空白略宽一些为宜,让观察者关注柱子的高度,而不是宽度和面积;

3、如果柱形图中某些具体的数值很重要,那么直接在柱子的附近显示数据标签,把 Y 轴隐藏掉,让观察者聚焦于关键的信息本身,而不是视线来回移动;

4、如果希望用柱形图来反映数据的整体趋势,那么可以考虑保留 Y 轴,但是应该将 Y 轴的颜色变成灰色,以削弱其重要性;

5、谨慎使用包含多组数据的条形图,因为这可能会让观察者难以得出结论,考虑你想对比什么,并以此构造分类的层级,尽可能让柱形图变得简单易懂;

6、不要使用 3D 效果,虽然 3D 效果看起来比较炫酷,但是它扭曲了数据的真实性,反而让数据变得难以解读和对比

数据如下:

代码语言:text
复制
city	AQI2017/1/1
郑州	195.6
洛阳	196.79
安阳	236.89
开封	169.88
焦作	208.87
平顶山	171.36
信阳	128.35
周口	142.37
鹤壁	190.61
新乡	175.89
濮阳	189.14
许昌	171.04
漯河	163.27
南阳	146.71
商丘	137.33
驻马店	144.95
三门峡	158.56

代码如下:

代码语言:python
复制
# 导入所需的库
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'}

df=pd.read_excel('./data/AQI.xlsx',index_col=0,dtype={'AQI2017/1/1':np.float16})
df=df.sort_values('AQI2017/1/1',ascending=False)
# 画图用的数据定义
x = df.index
y = df.iloc[:,0]

c2=[c['深蓝色'],c['蓝色'],c['浅蓝色'],c['浅橙色'],c['橙色'],c['深橙色']]
codes=pd.cut(y,pd.interval_range(0,300,freq=50)).values.codes
colors=[c2[i] for i in codes]
# 使用「面向对象」的方法画图
fig, ax = plt.subplots(figsize=(8, 6))

# 设置标题
ax.set_title('\n 2017年1月份河南省各地市AQI排名\n', fontsize=28, loc='left', color=c['深灰色'])

# 画柱形图
ax.bar(x, y, width=0.5, color=colors)

#均值线
ax.hlines(y.mean(),x[0],x[-1], color=c['灰色'],lw=3,ls='--')
ax.text(x[-2],y.mean()+5,'平均值:{:.0f}'.format(y.mean()),color=c['灰色'],fontsize=24)
# 用箭头强调对比的关系
ax.annotate('', xytext=(x[0], y[0]+20),xy =(x[-1], y[-1]+20), arrowprops=dict(color=c['深灰色']))

# 设置数据标签
for a, b in zip(x, y):
    ax.text(a, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=22, color=c['深灰色'])

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

# 隐藏 X 轴的刻度线
ax.tick_params(axis='x', which='major', length=0,labelcolor='b', labelsize='medium', width=3)
 
# 隐藏 Y 轴刻度
ax.set_yticks([])

# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=20, colors=c['深灰色'])

plt.show()

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

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

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

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

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