【问题标题】:Succint way to add line segments to plotly graph (with python/jupyter notebook)?将线段添加到绘图图的简洁方法(使用 python/jupyter 笔记本)?
【发布时间】:2019-09-20 05:27:40
【问题描述】:

我想创建一个带有多个水平线段的棒棒糖图 - https://python-graph-gallery.com/184-lollipop-plot-with-2-group。我想使用 plotly,因为我更喜欢图形(和简单的交互性),但找不到简洁的方式。

有两种线图 (https://plot.ly/python/line-charts/) 并且您可以在布局中添加线 (https://plot.ly/python/shapes/#vertical-and-horizontal-lines-positioned-relative-to-the-axes),但是这两种解决方案都需要单独添加每个线段,每个大约 4-8 行代码。虽然我可以对此进行循环,但如果有人能指出任何具有内置矢量化的东西,例如 matplotlib 解决方案(第一个链接),我将不胜感激!

编辑:还尝试了以下代码,首先制作绘图 ala matplotlib,然后转换为绘图。线段在此过程中消失。开始认为这是不可能的。

mpl_fig = plt.figure()

# make matplotlib plot - WITH HLINES
plt.rcParams['figure.figsize'] = [5,5]
ax = mpl_fig.add_subplot(111)
ax.hlines(y=my_range, xmin=ordered_df['value1'], xmax=ordered_df['value2'], 
color='grey', alpha=0.4)
ax.scatter(ordered_df['value1'], my_range, color='skyblue', alpha=1, 
label='value1')
ax.scatter(ordered_df['value2'], my_range, color='green', alpha=0.4 , 
label='value2')
ax.legend()

# convert to plotly
plotly_fig = tls.mpl_to_plotly(mpl_fig)
plotly_fig['layout']['xaxis1']['showgrid'] = True
plotly_fig['layout']['xaxis1']['autorange'] = True
plotly_fig['layout']['yaxis1']['showgrid'] = True
plotly_fig['layout']['yaxis1']['autorange'] = True

# plot: hlines disappear :/
iplot(plotly_fig)

【问题讨论】:

    标签: python jupyter-notebook plotly plotly-python


    【解决方案1】:

    Plotly 没有为此类图表提供内置矢量化,因为它可以自己轻松完成,请根据您提供的链接查看我的示例:

    import pandas as pd
    import numpy as np
    import plotly.offline as pyo
    import plotly.graph_objs as go
    
    # Create a dataframe
    value1 = np.random.uniform(size = 20)
    value2 = value1 + np.random.uniform(size = 20) / 4
    df = pd.DataFrame({'group':list(map(chr, range(65, 85))), 'value1':value1 , 'value2':value2 })
    
    my_range=range(1,len(df.index)+1)
    
    # Add title and axis names
    data1 = go.Scatter(
            x=df['value1'],
            y=np.array(my_range),
            mode='markers',
            marker=dict(color='blue')
        )
    
    
    data2 = go.Scatter(
            x=df['value2'],
            y=np.array(my_range),
            mode='markers',
            marker=dict(color='green')
        )
    
    # Horizontal line shape
    shapes=[dict(
            type='line',
            x0 = df['value1'].loc[i],
            y0 = i + 1,
            x1 = df['value2'].loc[i],
            y1 = i + 1,
            line = dict(
                color = 'grey',
                width = 2
            )
        ) for i in range(len(df['value1']))]
    
    
    layout = go.Layout(
        shapes = shapes,
        title='Lollipop Chart'
    )
    
    # Plot the chart
    fig = go.Figure([data1, data2], layout)
    
    pyo.plot(fig)
    

    我得到的结果是:

    【讨论】:

      【解决方案2】:

      您可以像这样在数据中使用None

      import plotly.offline as pyo
      import plotly.graph_objs as go
      
      fig = go.Figure()
      
      x = [1, 4, None, 2, 3, None, 3, 4]
      y = [0, 0, None, 1, 1, None, 2, 2]
      
      fig.add_trace(
          go.Scatter(x=x, y=y))
          
      pyo.plot(fig)
      

      【讨论】:

        猜你喜欢
        • 2015-10-15
        • 2022-07-21
        • 2021-03-22
        • 2016-09-16
        • 2016-04-11
        • 2022-06-20
        • 2016-07-04
        • 2020-07-22
        • 2018-10-10
        相关资源
        最近更新 更多