news 2026/3/2 4:48:34

利用镜像条形图探索Erasmus项目

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
利用镜像条形图探索Erasmus项目

利用镜像条形图探索Erasmus项目

importpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplt

数据探索

以下数据如果有需要的同学可关注公众号HsuHeinrich,回复【数据可视化】自动获取~

resume_url='https://raw.githubusercontent.com/holtzy/the-python-graph-gallery/master/static/data/resume.csv'erasmus_url='https://raw.githubusercontent.com/holtzy/the-python-graph-gallery/master/static/data/erasmus.csv'resume=pd.read_csv(resume_url)data=pd.read_csv(erasmus_url)print(resume.head())print(data.head())

1、resume数据:

country_name:国家地区名称

mean_rec:平均入境学生数

mean_send:平均出国学生数

2、data数据:

academic_year:年份

participants_x:出国学生的x位置

participants_y:入境学生的x位置

y_position:学生的y位置

绘制有序条形图

# 初始化布局fig,ax=plt.subplots(figsize=(6,6))# 创建两个条形图:数据已经按照mean_send升序了ax.barh(resume['country_name'],resume['mean_rec'],color='blue',alpha=0.3)ax.barh(resume['country_name'],-resume['mean_send'],color='darkorange',alpha=0.3)# 标题ax.set_title('Number of Student',weight='bold')plt.show()

移除边框并修改国家标签位置

fig,ax=plt.subplots(figsize=(6,6))# 创建两个条形图:数据已经按照mean_send升序了ax.barh(resume['country_name'],resume['mean_rec'],color='blue',alpha=0.3)ax.barh(resume['country_name'],-resume['mean_send'],color='darkorange',alpha=0.3)# 移除轴刻度ax.set_xticks([])ax.set_yticks([])# 移除边框ax.spines[['right','top','left','bottom']].set_visible(False)# 国家标签居中fori,country_nameinenumerate(resume['country_name']):ax.text(0,i,country_name,ha='center',va='center',fontsize=8,alpha=0.6)# 标题ax.set_title('Number of Student',weight='bold',fontsize=9)plt.show()

添加观测数据

fig,ax=plt.subplots(figsize=(6,6))# 创建两个条形图:数据已经按照mean_send升序了ax.barh(resume['country_name'],resume['mean_rec'],color='blue',alpha=0.3)ax.barh(resume['country_name'],-resume['mean_send'],color='darkorange',alpha=0.3)# 移除轴刻度ax.set_xticks([])ax.set_yticks([])# 移除边框ax.spines[['right','top','left','bottom']].set_visible(False)# 国家标签居中fori,country_nameinenumerate(resume['country_name']):ax.text(0,i,country_name,ha='center',va='center',fontsize=8,alpha=0.6)# 为每个国家地区添加不同年份的观测数据y_position=0fori,rowindata.iterrows():# 获取观测值数据sending=-row['participants_x']receiving=row['participants_y']y_position=row['y_position']years=row['academic_year']# 根据相关年份更改 alpha 参数决定透明度year_alpha_mapping={'2014-2015':0.3,'2015-2016':0.4,'2016-2017':0.5,'2017-2018':0.6,'2018-2019':0.7,'2019-2020':0.9}alpha=year_alpha_mapping[years]*0.6# y轴位置添加小噪声y_position+=np.random.normal(0,0.1,1)# 添加散点ax.scatter(sending,y_position,c='darkorange',alpha=alpha,s=3)ax.scatter(receiving,y_position,c='darkblue',alpha=alpha,s=3)# 标题ax.set_title('Number of Student',weight='bold',fontsize=9)plt.show()

额外的注释丰富图表信息

# 初始化fig,ax=plt.subplots(figsize=(8,6))# 创建两个条形图:数据已经按照mean_send升序了ax.barh(resume['country_name'],resume['mean_rec'],color='blue',alpha=0.2)ax.barh(resume['country_name'],-resume['mean_send'],color='darkorange',alpha=0.2)# 移除轴刻度ax.set_xticks([])ax.set_yticks([])# 移除边框ax.spines[['right','top','left','bottom']].set_visible(False)# 国家标签居中fori,country_nameinenumerate(resume['country_name']):ax.text(0,i,country_name,ha='center',va='center',fontsize=8,alpha=0.6)# 为每个国家地区添加不同年份的观测数据y_position=0fori,rowindata.iterrows():# 获取观测值数据sending=-row['participants_x']receiving=row['participants_y']y_position=row['y_position']years=row['academic_year']# 根据相关年份更改 alpha 参数决定透明度year_alpha_mapping={'2014-2015':0.3,'2015-2016':0.4,'2016-2017':0.5,'2017-2018':0.6,'2018-2019':0.7,'2019-2020':0.9}alpha=year_alpha_mapping[years]*0.6# y轴位置添加小噪声y_position+=np.random.normal(0,0.2,1)# 添加散点ax.scatter(sending,y_position,c='darkorange',alpha=alpha,s=3)ax.scatter(receiving,y_position,c='darkblue',alpha=alpha,s=3)# 离校和入学学生标签ax.text(-6000,24,'Outgoing\nstudents',color='darkorange',ha='center',va='center',weight='bold')ax.text(6000,24,'Incoming\nstudents',color='darkblue',ha='center',va='center',weight='bold')# 描述信息的标题ax.text(-7000,9,'Students\nexchanges\nin Europe',ha='left',va='center',weight='bold',fontsize=14)# 描述信息text='''Country ranking based on a sample Erasmus programs. Bars show the annual average for the period, points show the values for each year.'''ax.text(-7000,4.5,text,ha='left',va='center',fontsize=7)# 著作信息text='''Data: Data.Europa | Plot: @BjnNowak'''ax.text(-7000,1,text,ha='left',va='center',fontsize=6)# 年份图例ax.text(x=4200,y=11,s='Academic Year',fontsize=7,weight='bold')y_position=10# 开始的位置foryear,alphainyear_alpha_mapping.items():# 添加点ax.scatter(4000,y_position,alpha=alpha,s=5,c='black')ax.text(x=4200,y=y_position-0.2,s=year,fontsize=7)y_position-=1# 迭代减少# 标题ax.set_title('Number of Student',weight='bold',fontsize=9)plt.show()

参考:Mirror barplot with data points

共勉~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/25 8:08:19

想入门网络安全?CSB网安基地怎么样?手把手教你选择靠谱培训机构!

引言:为什么需要考虑培训机构?​​ 自学网络安全,你会面临:​知识体系庞杂不知从何开始、理论枯燥难以坚持、缺乏实战环境、遇到问题无人解答、学习效果无法验证、学完不知如何求职等诸多痛点。 一家优秀的培训机构,…

作者头像 李华
网站建设 2026/3/2 4:06:38

从一次增删改操作开始:彻底理解 MySQL Buffer Pool 的地位与作用

🔍 从一次增删改操作开始:彻底理解 MySQL Buffer Pool 的地位与作用 在学习 MySQL 的过程中,Buffer Pool 是一个你必须完全吃透的核心组件。无论是增删改查、事务、redo/undo、索引机制、锁机制,最终都绕不开 Buffer Pool。 但很多…

作者头像 李华
网站建设 2026/2/21 17:09:25

Java过滤器-拦截器-AOP-Controller

1 对比组件核心用途主要应用场景‌过滤器 (Filter)‌在请求到达Servlet之前或响应返回客户端之前,对原始的ServletRequest和ServletResponse进行预处理或后处理。字符编码设置、敏感词过滤、URL级别的权限认证、请求日志记录。‌12‌拦截器 (Interceptor)‌在请求进…

作者头像 李华
网站建设 2026/3/1 2:10:45

jQuery圆形进度条插件:创建动态环形进度指示器的完整指南

jQuery圆形进度条插件:创建动态环形进度指示器的完整指南 【免费下载链接】jquery-circle-progress jQuery Plugin to draw animated circular progress bars 项目地址: https://gitcode.com/gh_mirrors/jq/jquery-circle-progress 在现代网页开发中&#xf…

作者头像 李华
网站建设 2026/2/28 12:33:25

Wan2.2-T2V-5B本地化部署方案:保护数据隐私的最佳实践

Wan2.2-T2V-5B本地化部署方案:保护数据隐私的最佳实践你有没有想过,一个能“看懂文字就生成视频”的AI模型,居然能在你的办公室服务器上安静运行,连一比特数据都不用上传到云端?🤯 这听起来像科幻片的桥段&…

作者头像 李华
网站建设 2026/2/28 18:24:16

Wan2.2-T2V-A14B助力地方文旅局打造城市IP形象视频

Wan2.2-T2V-A14B助力地方文旅局打造城市IP形象视频 你有没有刷到过那种让人眼前一亮的城市宣传片?夜幕下的西湖泛着微光,汉服少女提灯走过石桥,远处雷峰塔灯火通明,突然一条金龙从湖面腾起——画面电影感拉满,情绪瞬间…

作者头像 李华