Как создать график с двумя разными осями Y в Python - PullRequest
2 голосов
/ 16 июня 2020

У меня есть 2D-массив, и я использую эти данные для построения графика, например:

data = [[2.01756016,  2.83041846,  3.81709531,  4.98948707,  6.2480729],
 [2.01756016, 2.59428527, 3.42083514, 4.15525314, 4.87254428],
 [2.01756016, 2.47796649, 2.95297856, 3.37313728, 3.66131579],
 [2.01756016, 2.24718239, 2.56393939, 2.70463483, 2.65250443]]

fig, ax = plt.subplots(figsize=(6, 6))

sidex = np.linspace(0.875, 2.125, 6)
sidey = np.linspace(5, 45, 5)

x, y = np.meshgrid(sidex, sidey)
z = [[data[i][j] for j in range(len(data[0]))] for i in range(len(data))]
plt.pcolormesh(x, y, z)

plt.xticks([1, 1.25, 1.5, 1.75, 2])
plt.yticks([10, 20, 30, 40])

plt.xlabel('X')
plt.ylabel('Y')


plt.show()

enter image description here

Теперь я пытаюсь изменить ось y

  1. сделать ось y с Y на Y / 10

  2. создать вторую ось y справа Сторона графика: Y / 100

Как на рисунке ниже. Как я могу этого добиться?

Я пытаюсь заменить plt.yticks([10, 20, 30, 40]) на plt.yticks([1, 2, 3, 4]), но результат не тот, который мне нужен.

enter image description here

1 Ответ

2 голосов
/ 16 июня 2020

Вы можете достичь этого, используя twinx(). Я рекомендую использовать ax.set_yticks и ax.set_yticklabels для большего контроля, но можно было бы использовать и plt.yticks(ticks=ticks, labels=labels).

EDIT : Я добавил шкалу цветов к графику. При создании шкалы цветов вы можете указать mappable (объект, для которого должны быть сопоставлены цвета) в качестве первого аргумента. Для этого я назначил colorme sh переменной для последующего повторного использования (image = ax.pcolormesh(x, y, z)).

data = [[2.01756016,  2.83041846,  3.81709531,  4.98948707,  6.2480729],
 [2.01756016, 2.59428527, 3.42083514, 4.15525314, 4.87254428],
 [2.01756016, 2.47796649, 2.95297856, 3.37313728, 3.66131579],
 [2.01756016, 2.24718239, 2.56393939, 2.70463483, 2.65250443]]

fig, ax = plt.subplots(figsize=(6, 6))

ax2 = ax.twinx()

sidex = np.linspace(0.875, 2.125, 6)
sidey = np.linspace(5, 45, 5)

x, y = np.meshgrid(sidex, sidey)
z = [[data[i][j] for j in range(len(data[0]))] for i in range(len(data))]
image = ax.pcolormesh(x, y, z)

ax.set_xticks([1, 1.25, 1.5, 1.75, 2])
ax.set_yticks([10, 20, 30, 40])
ax.set_yticklabels([1, 2, 3, 4])
ax2.set_yticks([10, 20, 30, 40])
ax2.set_yticklabels([10, 20, 30, 40])
ax2.set_ylim(ax.get_ylim())

fig.colorbar(image, pad=0.1)

ax.set_xlabel('X')
ax.set_ylabel('Y/10')
ax2.set_ylabel('Y')
plt.tight_layout()

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...