如何使用Python实现Racing Bar Chart竞速条形图可视化及自动排序
Python 竞速条形图(Racing Bar Chart)实现教程
现有代码的问题
你提供的代码无法实现条形自动上下变动,核心原因是直接用固定顺序的国家名称作为Y轴分类,每个动画帧的Y轴顺序不会随数值变化调整,因此数值高的国家不会自动上移。
解决方法(基于Plotly修改)
我们需要对每个时间帧的数据单独排序,生成动态排名作为Y轴坐标,实现位置自动调整,修改后的完整代码如下:
import plotly.express as px import pandas as pd import numpy as np url='https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv' def read_file(url): df = pd.read_csv(url) return df def filter_specific_country(df, selected_countries): df1=df[df['Country/Region'].isin(selected_countries) ] countrywise_grouped_df = df1.groupby(df['Country/Region']).sum().drop(['Lat','Long'], axis=1) return countrywise_grouped_df def transpose_and_reformat_data(df): df_t=df.transpose() df_t.reset_index(inplace=True) df_t.rename(columns={'Country/Region':'Index_Col', 'index':'Dates'}, inplace=True) return df_t confirmed_dataset = read_file(url) selected_countries=['India','China','Italy','Spain','France','Australia','Germany','Japan','Korea, South','Pakistan', 'Russia','United Kingdom','Canada','Iran','Brazil','Singapore','South Africa','US'] ds=filter_specific_country(confirmed_dataset,selected_countries) data=transpose_and_reformat_data(ds).melt(id_vars=["Dates"], var_name="Country", value_name="Confirmed_Count") # 关键修改:按日期分组,给每个日期的国家按确诊数降序排,生成动态排名 data['Dates'] = pd.to_datetime(data['Dates']) data = data.sort_values(['Dates', 'Confirmed_Count'], ascending=[True, False]) data['rank'] = data.groupby('Dates').cumcount() + 1 # 排名越小位置越靠上 plot_title='Visualizing the spread of Novel Coronavirus COVID-19 (2019-nCoV)' fig = px.bar(data, y="rank", x="Confirmed_Count", color="Country", text="Country", # 条形上显示国家名 animation_frame="Dates", range_x=[1, max(data['Confirmed_Count'])*1.1], range_y=[0, len(selected_countries)+1], orientation='h', hover_data={'Confirmed_Count': ':,.0f', 'Country': True, 'rank': False} # hover显示的内容 ) # 调整布局,隐藏Y轴刻度,反转Y轴让排名1在最上方 fig.update_layout( title=plot_title, yaxis_title='Countries', yaxis = dict( tickmode = 'array', tickvals = [], autorange="reversed" ), xaxis_tickangle=90, font=dict(family="Arial",size=10,color="#7f7f7f") ) # 调整条形上文本的位置 fig.update_traces(textposition='inside', insidetextanchor='start') fig.show()
更简便的实现方案:使用bar_chart_race库
如果不需要自定义复杂效果,可以直接使用专门的竞速条形图库,仅需几行代码即可实现自动排序的动画效果:
- 先安装库:
pip install bar-chart-race - 示例代码:
import bar_chart_race as bcr # 直接用处理好的宽格式数据(行是日期,列是国家,值是确诊数) bcr.bar_chart_race( df=ds, title='COVID-19 确诊数竞速条形图', orientation='h', sort='desc', n_bars=17 )
内容的提问来源于stack exchange,提问作者Dibyendu Banerjee
相关产品推荐
相关产品推荐

