Pandas、matplotlib 和 plotly - 如何修复系列图例?
Pandas, matplotlib and plotly - how to fix series legend?
我正在尝试从 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
列名,dataframe的索引名
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')
图例不能很好地从 matplotlib 转换为 plotly。
幸运的是,向 matplotlib 图中添加图例非常简单:
update = dict(
layout=dict(
showlegend=True # show legend
)
)
py.iplot_mpl(fig, update=update)
查看完整工作 ipython notebook here。
详情请参考剧情user guide。
我正在尝试从 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
列名,dataframe的索引名
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')
图例不能很好地从 matplotlib 转换为 plotly。
幸运的是,向 matplotlib 图中添加图例非常简单:
update = dict(
layout=dict(
showlegend=True # show legend
)
)
py.iplot_mpl(fig, update=update)
查看完整工作 ipython notebook here。
详情请参考剧情user guide。