Python数据分析--柱状图

2022-04-22 17:37:37 浏览数 (1)

最近阅读学习了林骥老师的《数据化分析 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代码运行次数:0复制
# 导入所需的库
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()

0 人点赞