добавление линейного графика в imshow и изменение маркера оси

Я сделал прикрепленный график, используя следующие коды:

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] на размер массива.введите здесь описание изображения


person Physicist    schedule 30.12.2015    source источник
comment
Вы рассматривали возможность использования команд xlim и ylim? Я думаю, это должно помочь вам с первой проблемой   -  person Zachi Shtain    schedule 30.12.2015
comment
Это не работает. Если я использую xlim(-3,3), ylim(-3,3), то он просто увеличится до верхнего левого угла и отобразит V[0:3,0:3]   -  person Physicist    schedule 30.12.2015
comment
Является ли V изображением? похоже, что координаты x и y описывают строки и столбцы изображения   -  person Zachi Shtain    schedule 30.12.2015
comment
Не уверен, что такое определение «изображения», но V — это массив формы 1001x1001.   -  person Physicist    schedule 30.12.2015
comment
Вы ищете extent кварга для imshow.   -  person Joe Kington    schedule 30.12.2015
comment
Вы также можете рассмотреть contourf(x, y, Z), которые являются заполненными контурами.   -  person ssm    schedule 02.02.2016


Ответы (1)


В общем, вы ищете 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. imshow и pcolormesh обрабатывают экстенты немного по-разному. imshow "центрируется на ячейке", а pcolormesh "центрируется на сетке". Это разница в полпикселя, поэтому в данном случае на нее можно не обращать внимания.
  4. imshow установит аспект графика равным 1, так что одна единица в направлении x имеет тот же размер, что и одна единица в направлении y. Он также переворачивает ось Y по умолчанию.

Еще одно замечание: если вы предпочитаете не переворачивать ось Y, либо вызовите ax.invert_yaxis(), либо используйте origin='lower' и extent=[xmin, xmax, ymin, ymax].

person Joe Kington    schedule 30.12.2015