【问题标题】:Plotly: Add line to bar chartPlotly:将线添加到条形图
【发布时间】:2019-08-08 18:19:06
【问题描述】:

我有一个来自数据框的绘图条形图:

fig = df.iplot(asFigure=True, kind='bar', barmode = 'relative')
py.iplot(fig)

是否可以将数据框中的一列变成一行?

【问题讨论】:

标签: python plotly plotly-python


【解决方案1】:

在回答最后一条评论时,我更改了代码以包含您所要求的循环。 让我知道这是否有帮助:

import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot

init_notebook_mode(connected=True)

import pandas as pd
import numpy as np

N = 20
x = np.linspace(1, 10, N)
y = np.random.randn(N)+3
y2 = np.random.randn(N)+6
y3 = np.random.randn(N)+9
y4 = np.random.randn(N)+12
df = pd.DataFrame({'x': x, 'y': y, 'y2':y2, 'y3':y3, 'y4':y4})
df.head()

data = []
for i in df.columns:
    if i!= "x":
        data.append(
            go.Bar(
                x=df['x'], # assign x as the dataframe column 'x'
                y=df[i]
            )
        )

layout = go.Layout(
    barmode='stack',
    title='Stacked Bar with Pandas'
)

fig = go.Figure(data=data, layout=layout)

# IPython notebook
iplot(fig, filename='pandas-bar-chart-layout')

【讨论】:

    【解决方案2】:

    cmets 中的建议链接确实有一些有价值的资源,但它们不会直接回答您的问题。 iplot() 使用 pandas 数据框作为输入,并生成堆叠条形图。这里有一种方法可以让你做到这一点,尽管不使用df.iplot()


    一、剧情:

    现在,代码

    我的建议基于以下示例:plot.ly/pandas/bar-charts。正如您将看到的,这是一个基于 pandas 数据框的示例 - 就像 df.iplot()。您可以简单地从堆叠条中取出一个系列或“跟踪”,并通过更改将其显示为一条线

    go.Bar(x=df['x'],
           y=df['y4'])
    

    到:

     go.Scatter(x=df['x'],
                y=df['y4'])
    

    我还添加了一些元素,以便更轻松地在 Jupyter 笔记本中离线显示结果。另请注意,我已将最后一行从 py.iplot(fig, filename='pandas-bar-chart-layout') 更改为 iplot(fig, filename='pandas-bar-chart-layout')

    完成sn-p:

    import plotly.plotly as py
    import plotly.graph_objs as go
    from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
    
    init_notebook_mode(connected=True)
    
    import pandas as pd
    import numpy as np
    
    N = 20
    x = np.linspace(1, 10, N)
    y = np.random.randn(N)+3
    y2 = np.random.randn(N)+6
    y3 = np.random.randn(N)+9
    y4 = np.random.randn(N)+12
    df = pd.DataFrame({'x': x, 'y': y, 'y2':y2, 'y3':y3, 'y4':y4})
    df.head()
    
    data = [
        go.Bar(
            x=df['x'], # assign x as the dataframe column 'x'
            y=df['y']
        ),
        go.Bar(
            x=df['x'],
            y=df['y2']
        ),
        go.Bar(
            x=df['x'],
            y=df['y3']
        ),
        go.Scatter(
            x=df['x'],
            y=df['y4']
        )
    
    ]
    
    layout = go.Layout(
        barmode='stack',
        title='Stacked Bar with Pandas'
    )
    
    fig = go.Figure(data=data, layout=layout)
    
    # IPython notebook
    iplot(fig, filename='pandas-bar-chart-layout')
    

    【讨论】:

    • 还有一个问题,我有很多酒吧。有没有我可以设置的循环。 IE。对于数据框中的所有列,创建一个 go.Bar 命令?
    • @fred.schwartz 很高兴为您提供帮助!当我找到时间时,我会在loop 上循环。也许今晚晚些时候或明天。我不明白为什么它不起作用。您可以在 df 列的列表上循环并使用 go.Bar 创建一个 Bar 对象并将其存储在列表中。
    • 这是有道理的。把它整理好了。只是循环并附加到列表中
    • 非常感谢,似乎没有其他人能回答这个问题
    • @fred.schwartz 没问题!所以你的循环方法奏效了?