最近阅读学习了林骥老师的《数据化分析 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()