在之前写了十几篇如何做数据可视化改进的文章后,媳妇终于也是忍不住给我提需求了,你写文章倒是卡卡卡,那就把我的工作表也整一下吧,我想也没想就接了这个需求。
需求描述
先有给一个PPT的图片(ps: 我用手机拍的),然后说明这是不同阶段参与运动的频率,然后要在柱形图上增加目标值,本科生 90%、研究生95%、博士生 95%
解题思路
初始化数据
虽然没表格,有图像也行那就人工智能写一下数据,还好柱形图就三个。
import matplotlib.pyplot as plt
categories = ['本科生', '硕士', '博士'] # 类别:本科生、硕士、博士
current_values = [53.30, 52.43, 15.69] # 当前值
target_values = [90, 95, 95] # 目标值
第一次可视化
希望把目标和现状在图上有区分度,显示为虚线,现状显示为实线
结果把90%和95%的目标画成一条虚线延长线了,虽然目标值跟柱形图对应,但是虚线的长度太大。需求方不满意让我重新做
第二次可视化改进
调整目标值,让目标值对应柱形图的宽度,现状看着稍微好一些了
python代码
# 为每个柱形图绘制目标值虚线,并添加数值标签
for i, (rect, target) in enumerate(zip(rects1, target_values)):
left_limit = rect.get_x()
right_limit = rect.get_x() + rect.get_width()
ax.hlines(y=target, xmin=left_limit, xmax=right_limit, color='r', linestyles='--')
ax.text((left_limit + right_limit) / 2, target + 1, f'{target}%', ha='center', va='bottom', color='red', fontsize=8)
1. 循环结构:
for i, (rect, target) in enumerate(zip(rects1, target_values)):
- 这行代码通过
enumerate
函数迭代一个通过zip
函数组合的列表。zip(rects1, target_values)
将rects1
(柱形图对象列表)和target_values
(目标值列表)合并成一个元组列表。每次迭代都会同时获取一个柱形(rect
)和对应的目标值(target
),同时enumerate
提供一个索引i
。
2. 计算柱形图的左右边界:
left_limit = rect.get_x()
right_limit = rect.get_x() + rect.get_width()
rect.get_x()
获取当前柱形的左边界的 x 坐标。rect.get_width()
返回柱形的宽度。右边界 (right_limit
) 是左边界加上柱形的宽度。
3. 绘制水平虚线:
ax.hlines(y=target, xmin=left_limit, xmax=right_limit, color='r', linestyles='--')
- 使用
ax.hlines()
方法在 y 坐标为target
的位置画一条水平线,这条线从left_limit
(柱形的左边界)到right_limit
(柱形的右边界)。线条颜色设置为红色 ('r'
),样式为虚线 ('--'
)。
4. 添加数值标签:
ax.text((left_limit + right_limit) / 2, target + 1, f'{target}%', ha='center', va='bottom', color='red', fontsize=8)
ax.text()
方法用于在图表上放置文本。文本内容为目标值百分比(f'{target}%'
)。
-
第一个参数是 x 坐标,这里设置为柱形的中心点,即左右边界的平均值 (
(left_limit + right_limit) / 2
)。 -
第二个参数是 y 坐标,设置为目标值加1,即
target + 1
,这样标签会显示在目标线的正上方,避免覆盖线条。 -
ha='center'
设置水平对齐为中心,确保文本水平居中于指定的 x 坐标。 -
va='bottom'
设置垂直对齐为底部,使文本的底部对齐于指定的 y 坐标。 -
文本颜色为红色 (
'red'
),字体大小为 8。
第三次可视化改进
只有一个横向的虚线不太直观,我需要的是两个柱形图,目标用虚线框,现状用实线框,稍微修改一下变成这样的图,顺便把边框和网格线也去掉
python代码
# 绘制当前值柱形图
current_rects = ax.bar(categories, current_values, bar_width, alpha=opacity, color='b', label='当前')
# 目标值高于当前值时,才进行叠加绘制
for i, (rect, target) in enumerate(zip(current_rects, target_values)):
if target > current_values[i]: # 只在目标值高于当前值时绘制叠加部分
ax.bar(categories[i], target - current_values[i], bar_width, bottom=current_values[i],
alpha=opacity/2, color='r', hatch='', facecolor='none',edgecolor='r', linestyle='--',label='目标' if i == 0 else "")
# 移除顶部和右侧的边框,只保留X轴和Y轴的边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
代码解读 绘制叠加柱形图
ax.bar()
方法用于绘制柱形图。
-
categories[i]
: 指定柱形图的分类标签。 -
target - current_values[i]
: 柱形图的高度,表示目标值超过当前值的部分。 -
bar_width
: 柱形图的宽度。 -
bottom=current_values[i]
: 设置柱形图的底部开始位置,即在当前值的柱形图上方开始绘制。 -
alpha=opacity/2
: 设置透明度为原透明度的一半,使叠加部分更为透明,以区分当前值和目标值叠加部分。 -
color='r'
: 设置柱形图颜色为红色。 -
hatch=''
: 指定填充样式,这里为空,表示无填充样式。 -
facecolor='none'
: 设置填充颜色为无,使柱体透明,只显示边缘。 -
edgecolor='r'
: 设置边缘颜色为红色。 -
linestyle='--'
: 设置线条样式为虚线。 -
label='目标' if i == 0 else ""
: 为第一个叠加柱形图添加标签“目标”,其余不添加标签,避免图例重复。
第四次可视化改进
我想这次肯定OK了吧,老婆说,哦忘记了我还要加一条去年的目标值直线,我不禁陷入沉思,这大概就是程序员和产品经理的矛盾由来吧,我笑着对老婆说,小问题接着加上了这行代码
# 添加一条表示平均目标值的水平直线
ax.axhline(y=96, color='g', linestyle='-', linewidth=2, label='去年')
再给老婆看的时候,她说不用了这个直线加不加无所谓,接着跟我说我不懂她的业务,这时候我们还是很心平气和的对话
-
我说:把notebook给你看看,后面自己改改很简单
-
她说:你不爱我了?
-
我说:有事随时找我,一下就给你搞定,下课下课,(心理再大声说:后面肯定要教会你)
可视化改进前后
关于Python学习指南
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
👉Python所有方向的学习路线👈
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python70个实战练手案例&源码👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉Python大厂面试资料👈
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉Python副业兼职路线&方法👈
学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。
👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方优快云官方认证二维码或者点击链接免费领取【保证100%免费
】
点击免费领取《优快云大礼包》:Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取
