最近阅读学习了林骥老师的《数据化分析 Python 实战》,书中讲好的技能应该刻意的练习,而不是简单的重复。
学习林骥老师的数据可视化的每种图表时,原来代码略微修改,使其适用于自己工作业务中的数据可视化。
林骥老师将数据可视化分析源代码分享在他的GitHub空间https://github.com/linjiwx/mp
水平方向的条形图非常适合阅读,因为文字的方向通常也是水平的,这符合我们的阅读习惯,有利于提高信息传递的效率,特别是当类别名称很长的时候。
在这张图中,2017 年的数据统一用浅灰色表示,对于 2018年的数据,用橙色代表明显上升,用蓝色代表明显下降,用灰色代表变化不大,以便观众快速抓住重点信息。
数据如下:
代码语言:text复制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
代码如下:
代码语言: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'}
# 数据源路径
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()