在Plotly中更改/更新xtick标签和ytick标签不一致

时间:2019-03-26 06:34:05

标签: python matplotlib plotly plotly.js

让我用一个例子演示。让我们看一下here中显示的简单线条图,这是Plotly用户指南中的第一幅图:

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

trace1 = go.Scatter(x=[1,2,3], y=[4,5,6], marker={'color': 'red', 'symbol': 104, 'size': 10}, 
                    mode="markers+lines",  text=["one","two","three"], name='1st Trace')

data=go.Data([trace1])
layout=go.Layout(title="First Plot", xaxis={'title':'x1'}, yaxis={'title':'x2'})
figure1=go.Figure(data=data,layout=layout)
init_notebook_mode(connected=True)
iplot(figure1)

enter image description here

现在,说我想将x-tick标签更新为'A', 'B', 'C',将ytick标签更新为'E', 'F', 'G'。我可以这样更新图来做到这一点:

figure1['data'][0]['x']=['A', 'B', 'C']
figure1['data'][0]['y']=['E', 'F', 'G']

iplot(figure1)

enter image description here

到目前为止,一切都很好。但是,假设我首先使用matplotlib绘制图形,然后像这样转换为plotly:

import matplotlib.pyplot as plt
import plotly.tools as tls

plt.plot([1,2,3], [4,5,6], 'r+-', markersize=10)
plt.xlabel('x2')
plt.ylabel('y2')

mpl_fig = plt.gcf()
figure2 = tls.mpl_to_plotly(mpl_fig)

init_notebook_mode(connected=True)
iplot(figure2)

enter image description here

例如,当您要用来绘制图形的库仅设计用于matplotlib(或最大可能是seaborn)时,这才有意义。但是,您想使图成为动态/交互图,并在图中使用它们。

这一次,如果我尝试以与以前完全相同的方式更新图形,我将得到一个空白图形!

figure2['data'][0]['x']=['A', 'B', 'C']
figure2['data'][0]['y']=['E', 'F', 'G']

iplot(figure2)

enter image description here

不仅是空白图形,xtick标签和ytick标签也保持不变。

当我深入研究figure1['data'][0]['x']中包含的内容时,我发现它是一个元组:

enter image description here

当我检查figure2['data'][0]['x']中包含的内容时,它也是相同的元组:

enter image description here

figure1['data'][0]['y']figure2['data'][0]['y']相同-它们都包含元组('E', 'F', 'G')

那么,这是怎么回事?为什么在更新刻度线标签后未绘制figure2?我该如何解决?

1 个答案:

答案 0 :(得分:1)

到目前为止,我通过修补自己找到的解决方法是本质上用空白布局替换布局。出于某些原因,从matplotlib转换的绘图图的布局似乎导致未反映该图的更新。将布局设为空白(然后,如果需要,向其中添加内容,例如标题和轴标签,如下所示)后,它似乎运行良好:

figure2['layout'] = {'title':'First plot', 'xaxis':{'title':'x2'}, 'yaxis':{'title':'y2'}}

figure2['data'][0]['x']=['A', 'B', 'C']
figure2['data'][0]['y']=['E', 'F', 'G']

iplot(figure2)

enter image description here