You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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库

如果不需要自定义复杂效果,可以直接使用专门的竞速条形图库,仅需几行代码即可实现自动排序的动画效果:

  1. 先安装库:pip install bar-chart-race
  2. 示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:36:04