Pandas、matplotlib 和 plotly - 如何修复系列图例?

Posted

技术标签:

【中文标题】Pandas、matplotlib 和 plotly - 如何修复系列图例?【英文标题】:Pandas, matplotlib and plotly - how to fix series legend? 【发布时间】:2015-07-08 03:18:48 【问题描述】:

我正在尝试从 pandas 数据框创建交互式绘图图。

但是,我无法正确显示图例

这是一个工作示例:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.plotly as py

# sign into the plotly api
py.sign_in("***********", "***********")

# create some random dataframes
dates = pd.date_range('1/1/2000', periods=8)
df1 = pd.DataFrame(np.random.randn(8, 1), index=dates, columns=['A'])
df2 = pd.DataFrame(np.random.randn(8, 1), index=dates, columns=['B'])
df1.index.name = 'date'
df2.index.name = 'date'

现在我尝试使用 plotly 绘制数据框。

fig, ax = plt.subplots(1,1)
    
df1.plot(y='A', ax=ax)
df2.plot(y='B', ax=ax)
    
py.iplot_mpl(fig, filename='random')

注意没有图例

编辑:

根据以下建议,我添加了 update 字典。尽管这确实显示了图例,但它却把情节本身弄乱了:

fig, ax = plt.subplots(1,1)
    
df1.plot(y='A', ax=ax)
df2.plot(y='B', ax=ax)
    
update = dict(
    layout=dict(
        annotations=[dict(text=' ')],  # rm erroneous 'A', 'B', ... annotations
        showlegend=True                # show legend 
    )
)
py.iplot_mpl(fig, update=update, filename='random')

编辑 2:

layout 字典中删除annotations 条目会导致绘图正确显示,但图例不是y 列名,而是x 列名,即数据框的索引名称

fig, ax = plt.subplots(1,1)
    
df1.plot(y='A', ax=ax)
df2.plot(y='B', ax=ax)
    
update = dict(
    layout=dict(
        showlegend=True                # show legend 
    )
)
py.iplot_mpl(fig, update=update, filename='random')

这将导致以下情节:

编辑 3:

我找到了一种覆盖图例文本的方法,但它似乎有点笨拙。鉴于我已经指定了要绘制的数据框列:

df1.plot(y='A', ax=ax)

我原以为y='A' 会导致'A' 被用作图例标签。

似乎情况并非如此,虽然可以使用索引标签进行覆盖,如下所示,但感觉不对。

有没有更好的方法来达到这个结果?

update = dict(
    layout=dict(
        showlegend=True,
    ),
    data=[
        dict(name='A'),
        dict(name='B'),
    ]
)
py.iplot_mpl(fig, update=update, filename='random')

【问题讨论】:

【参考方案1】:

图例不能很好地从 matplotlib 转换为 plotly。

幸运的是,向 matplotlib 图中添加情节图例是直截了当的:

update = dict(
    layout=dict(
        showlegend=True  # show legend 
    )
)
py.iplot_mpl(fig, update=update)

查看完整的工作ipython notebook here。

更多信息,请参考plotlyuser guide。

【讨论】:

PlotlyDictKeyError: Invalid key, 'showlegend', for class, 'Figure'. 您使用的是什么版本的 plotly,因为您的解决方案不适合我?我有 1.6.16,这似乎是 pip 的最新版本 恐怕还是不行。我已经更新了问题以包含一个完整的工作示例,它应该允许您复制我看到的行为(如果您愿意!) - 感谢您的帮助! 实际上,我已经删除了您建议的annotations 条目,这似乎有效。 annotations 部分是干什么用的? 我的错误。我确信这个问题的早期版本中所附的图包含错误转换的注释(因此 update 中的 annotations 键值)。笔记本有完整的工作解决方案nbviewer.ipython.org/github/etpinard/plotly-misc-nbs/blob/…。

以上是关于Pandas、matplotlib 和 plotly - 如何修复系列图例?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Matplotlib、pandas 和 sklearn 创建线性回归图?

python pandas和matplotlib安装冲突[重复]

Python大数据与机器学习之NumPy初体验

使用 matplotlib 和 pandas 制作 groupby 图

matplotlib结合pandas画图

Matplotlib与Pandas结合时对fig、ax、plt的理解