Средние значения осей для 2D-графиков в matplotlib - PullRequest
0 голосов
/ 19 февраля 2020

Я строю трехмерный набор данных (x, y и значение - так эффективно изображение в оттенках серого) с помощью matplotlib. Я хочу создать полосу сбоку от графика со средними значениями Y для строки и полосу снизу со средними значениями X для столбца. Результат net должен быть похож на scatter history (но вместо гистограммы на стороне это просто полоса цвета, представляющая эту конкретную строку / столбец).

Я видел эти графики раньше и хотел бы использовать один, я просто не могу понять имя функции.

Спасибо за помощь:)

т.е.

[1,2,3,4] |  [5
[4,3,2,1] |  5
[1,1,4,4] |  2.5]
----------
[2,2,3,3]

1 Ответ

0 голосов
/ 20 февраля 2020

Вот способ рисовать изображения на разных сюжетах. xticks на основном изображении перемещаются в верхнюю часть и удаляются с правой панели.

Тестовая функция выбрана так, чтобы иметь идентифицируемые признаки в обоих направлениях.

vmin и vmax используются для установки цветового диапазона: значения изображения на vmin сопоставляются с самым низким цветом (аналогично черному для цветовой карты inferno или белым для цветовой карты Greys), а значения изображения на vmax получите самый высокий цвет (желтый для inferno, черный для Greys). Значения изображения между vmin и vmax постепенно отображаются на цвета между ними. Значения изображения, меньшие vmin, сопоставляются с одним и тем же самым низким цветом.

Важно, чтобы значения vmin и vmax для 3 изображений были равными, поэтому все три имеют одинаковое преобразование цвета. Если vmin и vmax не установлены, matplotlib вычисляет самое низкое и самое высокое значение на основе данных. Но средства обычно имеют меньший диапазон значений, поэтому соответствующие значения больше не будут окрашиваться одинаково.

Вместо установки vmin и vmax может быть задана норма. норма имеет аналогичную функцию, но более мощна, например, когда необходимо преобразование логарифми c.

from matplotlib import pyplot as plt
import numpy as np

x, y = np.meshgrid(np.linspace(-10, 10, 200), np.linspace(-10, 10, 200))
z = np.where((x < 7) & (y < 9), np.sin(x) + np.cos(y) ** 2, 2-np.cos(x) ** 2)

z1 = np.mean(z, axis=1).reshape(x.shape[0], 1)
z0 = np.mean(z, axis=0).reshape(1, x.shape[1])

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(7, 7),
                         gridspec_kw={'width_ratios': [10, 1], 'height_ratios': [10, 1], 'wspace': 0.1, 'hspace': 0.1})

vmin, vmax = -1, 2
cmap = plt.cm.inferno
extent=[-10, 10, -10, 10]

axes[0][0].imshow(z, cmap=cmap, extent=extent, vmin=vmin, vmax=vmax, aspect=1, origin='lower')
axes[0][0].xaxis.tick_top()

axes[0][1].imshow(z1, cmap=cmap, extent=extent, vmin=vmin, vmax=vmax, aspect=10, origin='lower')
axes[0][1].set_xticks([])
axes[0][1].yaxis.tick_right()

axes[1][0].imshow(z0, cmap=cmap, extent=extent, vmin=vmin, vmax=vmax, aspect=1 / 10, origin='lower')
axes[1][0].set_yticks([])

axes[1][1].axis('off')

plt.tight_layout()
plt.show()

example image

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