当我将悬停模式设置为“x统一”时,如何获取要重新排序的绘图图形的悬停框中的信息?

问题描述 投票:0回答:1

我已经构建了一个主要由 go.Scatter 痕迹组成的绘图图形。这些跟踪中的每一个都有稍微不同的悬停模板,但我希望合并悬停框中的信息,因此我将悬停模式设置为“x统一”,这解决了我的主要问题,但我还有另一个小问题,我想解决。

我的代码的一个非常基本的重建如下所示:

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris_df = pd.read_csv(url,header=None,encoding='utf-8')
iris_df.columns = ['sepal length','sepal width','petal length', 'petal width', 'class']

test_fig =  go.Figure()

class_colors = {'Iris-setosa':'blue', 'Iris-versicolor':'green', 'Iris-virginica':'purple'}

for group in iris_df['class'].unique():
    iris_df_class = iris_df[iris_df['class']==group]
    test_fig.add_trace(go.Scatter(x=iris_df_class['sepal length'],
                                 y= iris_df_class['petal length'],
                                 mode='markers',
                                 marker=dict(size=10, color=class_colors[group], symbol=1),
                                 text= group,
                                 hoverinfo='text',
                                 hovertemplate = '<i>Sepal length</i>: %{x:.2f} <extra></extra>',
                                 name= group,
                                 showlegend=True,
                                 legendgroup=group))

    iris_df_class_over_6 = iris_df_class[iris_df_class['sepal length']>6]
    test_fig.add_trace(go.Scatter(x=iris_df_class_over_6['sepal length'],
                                 y= iris_df_class_over_6['petal length']+0.5,
                                 mode='markers',
                                 marker=dict(size=12, color=class_colors[group], symbol=5),
                                 name='trace2',
                                 meta=iris_df_class_over_6['petal width']/iris_df_class_over_6['sepal width'],
                                 hovertemplate='<i>Petal length</i>: %{y:.2f} <br><i>Petal/sepal width ratio</i>: %{meta:0.2f} <extra></extra>',
                                 showlegend=False,
                                 legendgroup=group))

    for s,p in zip(iris_df_class_over_6['sepal length'], iris_df_class_over_6['petal length']):
        test_fig.add_trace(go.Scatter(x=[s,s],
                                      y=[p,p+0.5],
                                      mode='lines',
                                      marker_line_width = 2,
                                      line_color=class_colors[group],
                                      name='trace-intermediate',
                                      hoverinfo='skip',
                                      showlegend=False,
                                      legendgroup=group))

test_fig.update_layout(xaxis_title="sepal length", yaxis_title="petal length", hovermode='x unified')
test_fig.show()

这会产生这样的情节:

查看悬停框时,可以看到 Iris-setosa 类(蓝色)的轨迹位于悬停框的顶部,然后是 Iris-versicolor(绿色),然后是 Iris-virginica(紫色)。如果给定的迹线在某个点不存在,则仍保持顺序(减去不存在的迹线)

现在我想做的是组织这个顺序,使紫色迹线位于顶部,然后是绿色,然后是底部的蓝色。我已尝试检查文档,但不清楚如何更改悬停框中信息的顺序。有人知道可以做什么吗?

python plotly
1个回答
0
投票

悬停框和图例中的轨迹及其各自的数据根据(这些轨迹的)创建顺序进行排序,即。该顺序遵循您从

iris_df['class'].unique()

获得的跟踪组顺序
print(iris_df['class'].unique())
#> ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']

向后迭代 iris 类可以得到所需的结果:

for group in iris_df['class'].unique()[::-1]:
    # ...

© www.soinside.com 2019 - 2024. All rights reserved.