簡體   English   中英

Can I make 3D plot in Python where Z is not a function of X,Y -- AttributeError: 'Series' object has no attribute 'has_data'

[英]Can I make 3D plot in Python where Z is not a function of X,Y -- AttributeError: 'Series' object has no attribute 'has_data'

我試圖了解如何使用 Python 制作 3D plot。 我有三個變量——X、Y 和 Z。這里,X 只是表示日期,Y 是第二時間維度,Z 是值。

舉一個具體的例子,假設我有天氣預報數據。 在每個日期,xa 氣象員都會提供未來 9 天的天氣預報。 因此,第二個時間維度 Y 是預測的第 1 天到第 9 天。 Z 保存預測的實際值。 我想制作一個 3d plot 來顯示每天的這些預測值。 我可以在 2d 圖中執行此操作,其中 X 是日期,Y 是預測值(如果完成 3D,Z 將是什么),然后我有 9 行顯示每個日期的 9 個預測值。

顯然,Z =\= f(X,Y) 但對於 X,Y 平面中的每個網格點都有一個唯一值 z。 所以,這似乎應該是可能的。 然而,我是一個完全的業余愛好者,在 Python 中制作 3D 圖。

目前,我的數據如下所示:

X'=[date1, date1, date1,...,date1,date2,....,date2...] 其中每個日期顯示 9 次。

Y'=[1,2,...9,1,...9,...]

Z'=[Day1Forecast1,day1forecast2,...day1forecast9,day2forecast1,...]

更新編輯---

這是我嘗試過的示例:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
import pandas as pd

df = pd.read_excel('filepathgoeshere')
print(df.head(5))

X = df['DATE']
Y = df['y']
Z = df['z']

X = df['DATE']
Y = df['j']
Z = df['H']

fig = plt.figure()
ax = fig.gca(projection='3d')
Axes3D.plot_trisurf(X, Y, Z, color='black')

我收到以下錯誤:“AttributeError: 'Series' object has no attribute 'has_data'”

我遲到了 2 年才回復,但是對於其他任何登陸這個線程的人來說,這對我有用:首先我創建一個 3d 圖表並定義軸名稱:

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt

ax = plt.axes(projection='3d')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

然后我創建由數據組成的列表:

t = [1, 3, 6, 9, 12, 15, 18, 21, 24] # t is time of the day
n = [1, 2, 3, 4, 5, 6, 7, 8, 9] # n is number of the day 
data1 = [day1forecast1, day1forecast2, ..., day1forecast9] 
data2 = [day2forecast1, day2forecast2, ..., day2forecast9]
data3 = [day3forecast1, day3forecast2, ..., day3forecast9]
...
data9=...

在這種情況下,您為每天創建一個數據列表。 每個數據列表中的值必須與時間列表中的值一樣多,因為這些值稍后將配對在一起。 值得注意的是,“n”和“t”不需要相同數量的值。 基本上,數據列表形成一個二維矩陣,“t”將鏈接到每一列,“n”將鏈接到每一行。

這是創建 2D 矩陣的簡單方法。 為了更容易理解正在發生的事情,我編寫了比必要更多的代碼:

rows, cols = (3, 9) 
data = [[0]*cols]*rows
data[0]=data1
data[1]=data2
data[2]=data3

如果你想投影超過 9 天,然后輸入 9 作為行數,我只是不想制作 9 個數據列表。

我剛剛添加了這個,因此您可以更改哪個軸上的值 go 以獲得您想要的結果,它還允許您在我定義的變量和示例中給出的變量之間建立鏈接:

x=w
y=t
z=data

然后我創建了一個將所有點連接在一起的網格,我 plot 整個事情

X, Y = np.meshgrid(x, y)
ax.contour3D(X, Y, z, 50, cmap='binary')

我希望這有幫助: :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM