代码之家  ›  专栏  ›  技术社区  ›  Parseltongue

在Plotly气泡图中标记特定气泡

  •  1
  • Parseltongue  · 技术社区  · 6 年前

    我很难弄清楚如何在绘图中标记特定的气泡。ly气泡图。我希望某些“异常值”气泡中有文本写入气泡中,而不是通过悬停文本。

    假设我有以下数据:

    import plotly.plotly as py
    import plotly.graph_objs as go
    
    trace0 = go.Scatter(
        x=[1, 2, 3, 4],
        y=[10, 11, 12, 13],
        mode='markers',
        marker=dict(
            size=[40, 60, 80, 100],
        )
    )
    
    data = [trace0]
    py.iplot(data, filename='bubblechart-size')
    

    我只想在对应于(1,10)和(4,13)的气泡上添加文本标记。此外,是否可以控制文本标记的位置?

    1 回复  |  直到 6 年前
        1
  •  3
  •   kayoz    6 年前

    您可以通过 annotations

    这允许您在图表上写入所需的任何文本,并将其引用到数据中。还可以使用位置定位或在x和y数据顶部应用其他计算来控制文本显示的位置。例如:

    x_data = [1, 2, 3, 4]
    y_data = [10, 11, 12, 13]
    z_data = [40, 60, 80, 100]
    
    annotations = [
        dict(
            x=x, 
            y=y,
            text='' if 4 > x > 1 else z, # Some conditional to define outliers
            showarrow=False,
            xanchor='center',  # Position of text relative to x axis (left/right/center)
            yanchor='middle',  # Position of text relative to y axis (top/bottom/middle)
        ) for x, y, z in zip(x_data, y_data, z_data)
    ]
    
    trace0 = go.Scatter(
        x=x_data,
        y=y_data,
        mode='markers',
        marker=dict(
            size=z_data,
        )
    )
    
    data = [trace0]
    layout = go.Layout(annotations=annotations)
    
    py.iplot(go.Figure(data=data, layout=layout), filename='bubblechart-size')
    

    如果使用袖扣,则可以稍微调整上述内容:

    bubbles_to_annotate = df[(df['avg_pos'] < 2) | (df['avg_pos'] > 3)]  # Some conditional to define outliers
    annotations = [
        dict(
            x=row['avg_pos'], 
            y=row['avg_neg'],
            text=row['subreddit'],
            showarrow=False,
            xanchor='center',  # Position of text relative to x axis (left/right/center)
            yanchor='middle',  # Position of text relative to y axis (top/bottom/middle)
        ) for _, row in bubbles_to_annotate.iterrows()
    ]
    
    df.iplot(kind='bubble', x='avg_pos', y='avg_neg', size='counts', 
           text='subreddit', xTitle='Average Negative Sentiment', 
           yTitle='Average Positive Sentiment', annotations=annotations,
           filename='simple-bubble-chart')
    

    您仍然需要定义注释,因为您需要一个条件参数。然后通过将其直接传递给袖扣 annotations