Plotly 多轴颜色合并
Plotly multiple axes colors merge
我正在尝试绘制镜像显示的两名足球运动员的不同统计数据。我喜欢更好的统计数据为绿色,而更差的统计数据为红色。唯一的问题是在我的色标中,一种颜色是红色,一种颜色是绿色,两者合并。有谁知道绘制这种图表的解决方案或更好的方法吗?
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])
我认为你的方法可以稍微简化一下。似乎不需要辅助 y 轴,只是针对不同玩家的分类轴。我还认为你设置颜色的方式,棕色是实际颜色 - 如果你只绘制一个条,它仍然是棕色。
实现你想要的更简单的方法是将两个玩家的信息组合在一个 DataFrame 中,然后创建一个名为 "Color"
的列,其中最小分数映射到 "red"
和最大分数映射到 "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()
我正在尝试绘制镜像显示的两名足球运动员的不同统计数据。我喜欢更好的统计数据为绿色,而更差的统计数据为红色。唯一的问题是在我的色标中,一种颜色是红色,一种颜色是绿色,两者合并。有谁知道绘制这种图表的解决方案或更好的方法吗?
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])
我认为你的方法可以稍微简化一下。似乎不需要辅助 y 轴,只是针对不同玩家的分类轴。我还认为你设置颜色的方式,棕色是实际颜色 - 如果你只绘制一个条,它仍然是棕色。
实现你想要的更简单的方法是将两个玩家的信息组合在一个 DataFrame 中,然后创建一个名为 "Color"
的列,其中最小分数映射到 "red"
和最大分数映射到 "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()