Python数据分析--条形图

2022-04-24 11:54:30 浏览数 (1)

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

0 人点赞