如何在for循环内在Plotly中注释子图

时间:2018-08-01 16:08:06

标签: pandas plotly subplot

我正在尝试在for循环中注释我的子图。每个子图将在图上打印RMS值。我尝试通过以下方式进行操作:

from plotly import tools
figg = tools.make_subplots(rows=4, cols=1)

fake_date = {"X":   np.arange(1, 101, 0.5), "Y": np.sin(x), "Z": [x + 1 for x in range(10)] * 20}
fake_date = pd.DataFrame(fake_date)
fake_date.sort_values("Z")

unique_ids = fake_date['Z'].unique()
train_id, test_id = np.split(np.random.permutation(unique_ids), [int(.6 * len(unique_ids))])


for i, j in enumerate(test_id):

    x_test = fake_date[fake_date['Z'].isin([test_id[i]])] 
    y_test = fake_date[fake_date['Z'].isin([test_id[i]])]


    # Evaluate 
    rms_test = 0.04
    r_test = 0.9



    Real = {'type' : 'scatter',
                     'x' : x_test.X,
                     'y' : x_test.Y,
                "mode" : 'lines+markers', 
                "name" : 'Real'}




    figg.append_trace(Real, i+1, 1)


figg['layout'].update( annotations=[dict(x = 10,y = 0.2,  text= rms_test, xref= "x1",yref="y1")]  )
figg['layout'].update(height=1800, width=600, title='Testing')
pyo.iplot(figg)

尽管here给出的答案似乎对其他人有用,但这不起作用。谁能指出我在做什么错? 我生成了假日期以提高可重复性

1 个答案:

答案 0 :(得分:1)

我不确定RMS值的确切位置,但是下面是一个示例代码,可以帮助您实现所需的目标。

我们创建一个数组annotation_arr,使用for循环在其中存储注释。

我们需要为每个单独的轴设置xvalyval。请记住,第一个轴将是x,第二个轴将是x2,因此,我为此编写了一个三元条件,请签出以下代码,让我知道是否有任何问题!

import plotly.graph_objs as go
from plotly.offline import download_plotlyjs,init_notebook_mode,plot,iplot
from plotly import tools
import numpy as np
import pandas as pd
init_notebook_mode(connected=True)
rows = 4
figg = tools.make_subplots(rows=rows, cols=1)

fake_date = {"X":   np.arange(0, 100, 0.5), "Y": [np.sin(x) for x in range(200)], "Z": [x + 1 for x in range(10)] * 20}
fake_date = pd.DataFrame(fake_date)
fake_date.sort_values("Z")

unique_ids = fake_date['Z'].unique()
train_id, test_id = np.split(np.random.permutation(unique_ids), [int(.6 * len(unique_ids))])
top = 0
annotation_arr = []
for i, j in enumerate(test_id):

    x_test = fake_date[fake_date['Z'].isin([test_id[i]])] 
    y_test = fake_date[fake_date['Z'].isin([test_id[i]])]


    # Evaluate 
    rms_test = 0.04
    r_test = 0.9



    Real = {'type' : 'scatter',
                     'x' : x_test.X,
                     'y' : x_test.Y,
                "mode" : 'lines+markers', 
                "name" : 'Real'}


    top = top + 1/rows
    i_val = "" if i == 0 else i + 1
    annotation_arr.append(dict(x = r_test,y = top,  text= rms_test, xref= "x"+str(i_val),yref="y"+str(i_val)))
    figg.append_trace(Real, i+1, 1)


figg['layout'].update( annotations=annotation_arr  )
figg['layout'].update(height=1800, width=600, title='Testing')
iplot(figg)