假設您有以下資料:
x1_Length = 100
x1 = np.linspace(10,100,num=x1_Length)
y1 = np.linspace(0, 1.3, num=x1_Length)
x2_Length = 200
x2 = np.linspace(50, 200, num=x2_Length)
y2 = np.exp(np.linspace(0, 1, num=x2_Length))
如果你想繪制這個,它會很簡單:
fig, ax = plt.subplots()
ax.plot(x1,y1, ".g")
ax.plot(x2,y2, "--r")
這給出了預期的結果,即使繪制的陣列具有不同的長度并且不共享 x 資料。

現在,假設您想在強度圖中繪制相同的資料。這會導致一些問題:
據我了解,強度圖(例如
imshow)繪制二維陣列,因此沒有 x 軸刻度或 y 軸刻度的直接概念。資料根據其在陣列中的索引呈現。在這里,這將是一個問題,因為兩個陣列的第一個元素不對應于相同的 x 值。二維陣列中的所有行/列都需要具有相同的長度。這是兩個問題中的次要問題,因為我總是可以找出最長的資料集并用例如 NaN 填充所有較短的資料集,如下所示:
dataset = [x1_data, x2_data] max_Length = np.max([array[0,:].shape[0] for array in dataset ]) data_array = np.nan * np.ones((2*len(dataset), max_Length)) for i, spectrum_array2D in enumerate(dataset): length = spectrum_array2D[0,:].shape[0] firstRowOfInsertion = 2*i data_array[[firstRowOfInsertion, firstRowOfInsertion 1], :length] = spectrum_array2D
我看不出有任何技術限制,為什么不能像plt.plot()can那樣將多個不同資料的陣列繪制成強度圖。理想情況下,我需要告訴它可以預期的強度圖,在本例中,2 個水平資料切片,然后提供 x 資料(繪制在 x 軸上)、y 資料(繪制在colorbar) 用于該圖應進入的切片的每個索引。您是否知道實作此目的的方法或任何能夠實作此目的的軟體包?
編輯:最終,我想要一個看起來像這樣的圖,它是從下面的@wtw 建議中采用的(這個圖中的資料是隨機的,我需要它是我的 y1 和 y2 陣列):

uj5u.com熱心網友回復:
經過討論,我認為需要的是一條用x點和顏色值繪制的線,y每次可能都有不同的值。
對這里的答案稍作修改(只是為了傳遞繪圖變數):
uj5u.com熱心網友回復:
matplotlib 的一種選擇是pcolormesh:
uj5u.com熱心網友回復:
據我了解,您知道,這兩個資料集不能相互交叉。這是第一個重要的條件。如果 to 值將占據網格網格中的相同像素,將選擇哪一個?但即使資料不相交,當兩個軸具有不同的采樣率/距離時,也可能會出現問題。在將它們都繪制在同一影像甚至網格中之前,您必須在相等的網格上重新采樣/插值兩個陣列。這很快就變得非常棘手并且容易出錯。如果我要嘗試這個,我會從創建單獨的顏色貼圖開始,使用相同的顏色代碼,但有兩個獨立的網格。下一步就是將其中一個圖形放在另一個圖形上并移動它以使軸線對齊;基本上是一個插圖。
uj5u.com熱心網友回復:
處理 wtw 的第一個答案我想出了一個方法,這有點 hacky... 使用他們的方法我無法繪制我的 1D 陣列,所以我通過將 2 個相同的陣列堆疊在一起使它們成為 2D。然后我指定這些應該繪制在什么 y 軸值上。這是我的最終代碼:
import numpy as np
import matplotlib.pyplot as plt
x1_Length = 100
x1 = np.linspace(10,100,num=x1_Length)
z1 = np.linspace(0, 1.3, num=x1_Length)
x1_data = np.stack([x1,z1])
x2_Length = 200
x2 = np.linspace(50, 200, num=x2_Length)
z2 = np.exp(np.linspace(0, 4, num=x2_Length))
x2_data = np.stack([x2,z2])
x3_Length = 30
x3 = np.linspace(50, 150, num=x3_Length)
z3 = np.sin(np.linspace(0, 4, num=x3_Length))
x3_data = np.stack([x3,z3])
y_data = [-1, 5, 12]
stepsize = np.min(np.abs(np.diff(y_data)))
dataset = [x1_data, x2_data, x3_data]
fig, ax = plt.subplots(1)
for i, spectrum_array2D in enumerate(dataset):
X, Y = np.meshgrid(spectrum_array2D[0,:], [y_data[i]-stepsize/4, y_data[i] stepsize/4]); print(f"X has shape {X.shape}, Y has shape {Y.shape}")
Z = np.vstack( [spectrum_array2D[1,:], spectrum_array2D[1,:]] ); print(f"Z has shape {Z.shape}")
ax.pcolormesh(X, Y, Z)
ax.set_yticks(y_data)
ax.set_xlabel("x")
ax.set_ylabel("y")
產生下圖:

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406727.html
標籤:
