Ось log2 не работает для гистограмм в matplotlib/seaborn

При построении гистограммы с использованием matplotlib/seaborn я хотел бы изменить ось х в масштабе log2. данные приведены здесь

когда я беру log2 значений и делаю гистограмму, это работает, но если я строю непогашенные значения и меняю ось X, используя set_xscaleДает неверный результат. код является:

import numpy as np
import seaborn as sns
import matplotlib.pylab as plt

df = pandas.read_table("data.csv",sep="\t")
plt.figure()
sns.set_style("ticks")
ax1 = plt.subplot(2, 1, 1)
plt.hist(df["y"])
ax1.set_xscale("log", basex=2)
ax2 = plt.subplot(2, 1, 2)
plt.hist(np.log2(df["y"]))

сюжет:

введите описание изображения здесь

это ошибка или я неправильно сменил оси?

1 ответ

Решение

Это ни то, ни другое! Посмотрите, что произойдет, если вы увеличите количество бинов:

plt.hist(df["y"], bins = 300)
ax1.set_xscale("log", basex=2)
ax2 = plt.subplot(2, 1, 2)
plt.hist(np.log2(df["y"]), bins=300)

logbins

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

Как сделать два случая идеальными? Передайте пользовательские размеры ящика в пространстве журнала plt.hist:

plt.figure()
sns.set_style("ticks")
ax1 = plt.subplot(2, 1, 1)
logbins = np.logspace(np.log2(df["y"].min()),
                      np.log2(df["y"].max()),
                      300, base=2)
plt.hist(df["y"], bins = logbins)
ax1.set_xscale("log", basex=2)
ax2 = plt.subplot(2, 1, 2)
plt.hist(np.log2(df["y"]), bins=300)

фиксированный

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

Другие вопросы по тегам