首页 > 解决方案 > 绘制多个轴颜色合并

问题描述

我试图绘制镜像的两个足球运动员的不同统计数据。我希望更好的统计数据具有绿色和更差的统计数据红色。唯一的问题是在我的色阶中,一种颜色是红色,一种是绿色,两者融合。有谁知道绘制这种图表的解决方案或更好的方法?

data =[['Messi', 88]]
   data2 = [['Ronaldo', -88]]

   df = pd.DataFrame(data, columns=['Player', 'Dribbling'])
   df2 = pd.DataFrame(data2, columns=['Player', 'Dribbling'])

   fig = make_subplots(specs=[[{"secondary_y": True}]])

   fig.add_trace(go.Bar(
            orientation='h',
            name=df['Player'],
            x=df['Dribbling'],
            marker_color=((df.Dribbling >= df2.Dribbling)).astype('int'),
            marker_colorscale=[[0, 'red'], [1, 'green']],
            ),secondary_y=False)
            

   fig.add_trace(go.Bar(
            orientation='h',
            name=df2['Player'],
            x=df2['Dribbling'],
            marker_color=((df.Dribbling >= df2.Dribbling)).astype('int'),
            marker_colorscale=[[0, 'red'], [1, 'green']],
            ),secondary_y=True)

   fig.update_layout(
      barmode="group"
   )
   fig.update_xaxes(range=[-100, 100])

标签: pythonpandasplotly

解决方案


我认为你的方法可以简化一点。似乎不需要辅助 y 轴,只需要针对不同玩家的分类。我还认为你设置颜色的方式,棕色是实际颜色 - 如果你只绘制一个条,它仍然是棕色。

实现您想要的更简单的方法是将两个玩家的信息组合在一个 DataFrame 中,然后创建一个名为"Color"where the minimum score is mapped to "red"and the maximum score is mapped to"green"的列,然后遍历 DataFrame 的行并添加一个水平条作为每次循环迭代的跟踪。

这种方法具有可推广的优点:如果您想绘制其他足球运动员的统计数据并将他们的条形图设为另一种颜色,您可以修改 DataFrame,绘图代码仍然可以工作。

import pandas as pd
import plotly.graph_objects as go

df = pd.DataFrame([['Messi', 88],['Ronaldo', -88]], columns=['Player', 'Dribbling'])
df["Color"] = ['red' if x==min(df.Dribbling) else "green" if x==max(df.Dribbling) else np.nan for x in df.Dribbling]

fig = go.Figure()
for row in df.itertuples(index=False):
    fig.add_trace(go.Bar(
        orientation='h',
        name=row.Player,
        x=[row.Dribbling],
        y=[row.Player],
        marker_color=row.Color,
    ))
        
fig.show()

在此处输入图像描述


推荐阅读