Создание лог-линейного графика в matplotlib с использованием hist2d

Мне просто интересно, можно ли это сделать. Я попытался установить ячейки явно с помощью numpy logspace, и я также попытался установить xscale в "log". Ни один из этих вариантов не работает. Кто-нибудь пробовал?

Я просто хочу 2d-гистограмму с осью X журнала и линейной осью Y.

1 ответов


почему это не работает, что plt.hist2d использует pcolorfast метод, который намного эффективнее для больших изображений, но не поддерживает оси журналов.

чтобы иметь 2D гистограмму, которая работает правильно на осях журнала, вам нужно будет сделать это самостоятельно, используя np.histogram2d и ax.pcolor. Однако это всего лишь одна дополнительная строка кода.

для начала давайте использовать экспоненциально разнесенные бункеры на линейном axis:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.random((2, 1000))
x = 10**x

xbins = 10**np.linspace(0, 1, 10)
ybins = np.linspace(0, 1, 10)

fig, ax = plt.subplots()
ax.hist2d(x, y, bins=(xbins, ybins))

plt.show()

enter image description here

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

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.random((2, 1000))
x = 10**x

xbins = 10**np.linspace(0, 1, 10)
ybins = np.linspace(0, 1, 10)

fig, ax = plt.subplots()
ax.hist2d(x, y, bins=(xbins, ybins))

ax.set_xscale('log') # <-- Only difference from previous example

plt.show()

enter image description here

обратите внимание, что масштабирование журнала, похоже, было применено, но цветное изображение (гистограмма) не отражает его. Бункеры должны быть квадратными! Они не потому, что художник создал pcolorfast не поддерживает оси бревна.

чтобы исправить это, давайте сделаем гистограмму np.histogram2d (как plt.hist2d использует за кулисами), а затем построить его с помощью pcolormesh (или pcolor), который поддерживает оси журнала:

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1977)

x, y = np.random.random((2, 1000))
x = 10**x

xbins = 10**np.linspace(0, 1, 10)
ybins = np.linspace(0, 1, 10)

counts, _, _ = np.histogram2d(x, y, bins=(xbins, ybins))

fig, ax = plt.subplots()
ax.pcolormesh(xbins, ybins, counts.T)

ax.set_xscale('log')

plt.show()

(обратите внимание, что мы должны транспонировать counts здесь, потому что pcolormesh ожидает, что оси будут в порядке (Y, X).)

теперь мы получаем результат, который мы ожидаем:

enter image description here