【问题标题】:Pandas line plot with markers based on another column带有基于另一列的标记的熊猫线图
【发布时间】:2019-08-16 00:17:21
【问题描述】:

我有一个像下面这样的数据框

df:

ind group people value value_50
 1      1    5    100    1
 1      2    2    90     1
 2      1    10   80     1
 2      2    20   40     0
 3      1    7    10     0
 3      2    23   30     0

我尝试对它们进行旋转,以在列中查看“组”单个指标

df = data.pivot_table(index = data.ind, columns = ['group'], values = ['people', 'value','value_50'])
df

然后尝试用 x 轴上的“ind”分别绘制两组的“值”

df.plot()

但我不想在图表中包含所有列,而是尝试根据 df['value_50'] 和基于 df['people'] 的大小气泡或大小标记为 c 和 s 参数着色分别。

这将有助于识别图表上的某些点

df['value'].plot(c =df['value_50'], s = df['value'])

但收到错误

AttributeError: Unknown property s

袖扣也可以,因为我试过了

 df['value'].iplot(c =df['value_50'], s = df['value'])

再次失败

pandas/袖扣怎么做?

【问题讨论】:

    标签: python pandas matplotlib plotly pandas-groupby


    【解决方案1】:

    您要求使用 plotly express,但使用 plotly.graph_objs 几乎同样简单且更灵活。

    剧情:

    代码 1:

    import numpy as np
    import plotly.graph_objs as go
    
    # plotly setup and traces
    fig = go.Figure()
    
    # lines 1
    fig.add_trace(go.Scatter(x=df.index, y=df['value'][1].values,
                                     name = 'value_1',
                                     mode = 'lines'))
    
    # lines 2
    fig.add_trace(go.Scatter(x=df.index, y=df['value'][2].values,
                                     name = 'value_2',
                                     mode = 'lines'))
    
    
    # markers 1
    fig.add_trace(go.Scatter(x=df.index, y=df['value'][1].values,
                                     name = 'people',
                                     mode = 'markers',
                                     marker=dict(color=df['value_50'][1], colorscale='viridis', colorbar=dict(title='value_50')),
                                     marker_size=df['people'][1]*1.8
                            )
    
                 )
    
    # markers 2
    fig.add_trace(go.Scatter(x=df.index, y=df['value'][2].values,
                                     name = 'people',
                                     mode = 'markers',
                                     marker=dict(color=df['value_50'][2], colorscale='viridis', colorbar=dict(title='value_50')),
                                     marker_size=df['people'][2]*1.8
                            )
    
                 )
    
    # adjust and show final figure
    fig.update_layout(legend=dict(x=-.15, y=1))
    fig.show()
    

    我仍然不能 100% 确定您在这里的目标是什么。让我知道这对您有什么作用,我们可以查看详细信息。

    【讨论】:

      【解决方案2】:

      我正在使用matplotlib 以您想要的方式绘制数据。回顾一下您的问题,您希望在 y 轴上使用 value 和在 x 轴上使用 ind 绘制数据,并且每个特定的点大小将基于 people 列中的值。整个图表在每个组之间进行划分。

      旋转 DF

      df_pv = df.pivot(index='ind', columns='group', values=['people', 'value', 'value_50'])
      
      >> out
      
             people   value   value_50
      group   1   2   1   2   1   2
      ind                     
      1       5   2   100 90  1   1
      2       10  20  80  40  1   0
      3       7   23  10  30  0   0
      

      图表

      import matplotlib.pyplot as plt
      
      fig, ax = plt.subplots(1,figsize=(10,5))
      
      ind = df_pv.index.values
      # generate random hex color & create as many colors as groups.
      r = lambda: random.randint(0,255)
      colors = ['#%02X%02X%02X' % (r(), r(), r()) for i in range(len(df_pv.people.columns.values))]
      labels = df_pv.people.columns.values
      
      for i in range(len(df_pv.people.values[0])):
          val = df_pv.value.values[:,i]
          peop = df_pv.people.values[:,i]
          for j in range(len(peop)):
              plt.scatter(x=[ind[j]], y=[val[j]],
                      marker='o', linestyle='--',s=peop[j]*7, color=colors[i])
      
          plt.plot(ind, val, color=colors[i], label=f'Group: {labels[i]}')
      
      plt.legend()
      plt.xticks(df_pv.index.unique())
      plt.ylabel('Value')
      plt.xlabel('Ind')
      plt.title('Graph')
      plt.show()
      

      起初,我希望创建图表并访问每个单独的标记来设置大小。不幸的是,我找不到这样的解决方案。

      相反,我们使用plt.scatter() 为每个组绘制每个单独的点。在这里,我们根据特定组的人员列分配点的大小。然后我们使用plt.plot() 连接每个点并分配标签和颜色。

      编写的代码可以接受 n 个不同的组,而无需手动分配任何值(颜色、点等)。

      【讨论】:

        猜你喜欢
        • 2013-08-01
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多