2016-08-24 113 views
0

我試圖取代For循環上Plotly Python的

fig.append_trace(trace1, 1, 1) 
fig.append_trace(trace2, 2, 1) 

在for循環代碼

totalPlot = 2 
x = ['trace%s'%(item + 1) for item in range(totalPlot)] 
y = [(item + 1) for item in range(totalPlot)] 
z = totalPlot * [1] 

for i, j, k in zip(x, y, z): 
    fig.append_trace(i, j, k) 

,使其更具可擴展性,因爲我添加更多的數據。但是,循環代碼不斷返回'TypeError:'str'對象不支持項目分配'。我做錯了什麼?

這裏是一個從Plotly類似代碼:

from plotly import tools 
import plotly.plotly as py 
import plotly.graph_objs as go 

trace1 = go.Scatter(
    x=[1, 2, 3], 
    y=[4, 5, 6] 
) 
trace2 = go.Scatter(
    x=[20, 30, 40], 
    y=[50, 60, 70], 
) 

fig = tools.make_subplots(rows=2, cols=1) 


# ----- Loop here ------- START 
fig.append_trace(trace1, 1, 1) 
fig.append_trace(trace2, 2, 1) 
# ----- Loop here ------- END 

fig['layout'].update(height=600, width=600, title='i <3 subplots') 
py.iplot(fig, filename='make-subplots') 
+0

究竟哪一行給你一個錯誤?當你試圖修改一個字符串對象(比如改變一個字符)時,錯誤「TypeError:'str'對象不支持項目賦值''。字符串是不可變的,所以你不能」改變「一個,但你可以做一個改變的副本。 –

+0

@machine渴望:這一行給我的TypeError:'fig.append_trace(i,j,k)' – Fxs7576

回答

1

在這段代碼中,它看起來像trace1是某種類似陣列的數據結構:

trace1 = go.Scatter(
    x=[1, 2, 3], 
    y=[4, 5, 6] 
) 

所以我想,當你打電話給fig.append_trace(trace1, 1, 1)時,它會爲這個類似數組的結構添加一個元素,這是第一個參數。

但是在你重新實現,你已經變成了跟蹤數據轉換成字符串:

x = ['trace%s'%(item + 1) for item in range(totalPlot)] 
... 
for i, j, k in zip(x, y, z): 
    fig.append_trace(i, j, k) 

這裏ix的元素,其又喜歡'trace%s'%(item + 1)的字符串。但是你不能將一個元素附加到一個字符串中。 Python字符串是不可變的。所以當你打電話給append_trace時,你自然會在這裏得到一個錯誤,關於無法用字符串做你想做的事情。

+0

我明白了。我將修復這個x並使其成爲一個數組。謝謝你的解釋。 :) – Fxs7576

+0

或者說,'x'已經是一個數組了。你可能需要做的是確保'x'的每個元素都是'go.Scatter'對象,而不是一個字符串。 –