簡體   English   中英

添加線圖以顯示和更改軸標記

[英]adding line plot to imshow and changing axis marker

我使用以下代碼制作了附圖:

a = 1
theta = np.linspace(0,2*np.pi,101)
x = np.linspace(-3*a,3*a,1001, dtype='complex')
y = np.linspace(-3*a,3*a,1001, dtype='complex')
X,Y = np.meshgrid(x,y)

# come manipulations with V
# (same shape and type as X,Y) not shown here 

plt.subplot(1,2,1)
plt.scatter(a*np.cos(theta), a*np.sin(theta))
plt.imshow(V.real)
plt.colorbar()
plt.subplot(1,2,2)
plt.scatter(a*np.cos(theta), a*np.sin(theta))
plt.imshow(V.imag)
plt.colorbar()

我想做的是:

1)改變曲線的比例,使得水平軸和垂直軸在-3 * a和3 * a之間變化

2)繪制圓邊界(以半徑= a為中心的原點)。 現在它出現在左上角,因為繪圖的比例從[-3 * a,3 * a]變為數組大小。 在此輸入圖像描述

在一般情況下,你正在尋找的extent kwarg到imshow

作為一個簡單的例子:

import numpy as np
import matplotlib.pyplot as plt

data = np.random.random((10, 10))

fig, ax = plt.subplots()
ax.imshow(data, extent=[10, 30, np.pi, -2*np.pi])
plt.show()

在此輸入圖像描述

在您給出的示例的情況下:

import numpy as np
import matplotlib.pyplot as plt

a = 1
theta = np.linspace(0, 2*np.pi, 100)

# We could replace the next three lines with:
# y, x = np.mgrid[-3*a:3*a:1000j, -3*a:3*a:1000j]
x = np.linspace(-3*a, 3*a, 1000)
y = np.linspace(-3*a, 3*a, 1000)
x, y = np.meshgrid(x, y)

# Now let's make something similar to your V for this example..
r = np.hypot(x, y)
V = np.cos(3*np.arctan2(y, x)) + np.sin(r) + np.cos(x)*1j * np.cos(r)

def plot(ax, data):
    ax.plot(a*np.cos(theta), a*np.sin(theta), color='black')
    im = ax.imshow(data, extent=[x.min(), x.max(), y.max(), y.min()])
    fig.colorbar(im, ax=ax, shrink=0.5)

fig, (ax1, ax2) = plt.subplots(ncols=2)

ax1.set(title='Real Portion')
plot(ax1, V.real)

ax2.set(title='Imaginary Portion')
plot(ax2, V.imag)

plt.show()

在此輸入圖像描述

但是,您也可以考慮在這種情況下使用pcolormesh 例如,我們可以將plot函數更改為:

def plot(ax, data):
    ax.plot(a*np.cos(theta), a*np.sin(theta), color='black')
    im = ax.pcolormesh(x, y, data)
    ax.set(aspect=1)
    fig.colorbar(im, ax=ax, shrink=0.5)

主要區別是:

  1. imshow可以插值,而pcolormesh提供矢量輸出並且不能插值(即它繪制了許多矩形而不是圖像)。
  2. pcolormesh有點慢,所以對於大圖像, imshow是更好的選擇。
  3. imshowpcolormesh略微區別對待范圍。 imshow是“以細胞為中心”,而pcolormesh是“以網格為中心”。 這是半像素差異,因此在這種情況下您可以忽略它。
  4. imshow將繪圖的方面設置為1,使得x方向上的一個單位與y方向上的一個單位的大小相同。 它默認也會翻轉y軸。

另一個注意事項:如果你不想讓y軸翻轉,可以調用ax.invert_yaxis()或使用origin='lower'extent=[xmin, xmax, ymin, ymax]

暫無
暫無

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

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