Ось 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)
Данные для гистограммы такие же, но распределение размера бина все еще линейно в верхнем случае.
Как сделать два случая идеальными? Передайте пользовательские размеры ящика в пространстве журнала 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)
Между этими двумя графиками все еще есть небольшие различия, но я считаю, что они не связаны с вашей первоначальной проблемой.