Seaborn дает неправильные значения на отметках оси X? - PullRequest
0 голосов
/ 03 мая 2019

В приведенном ниже коде Matplotlib дает правильный диапазон от 5,0 до 10,0, почему Seaborn отличается?

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from matplotlib import ticker

sns.set()

fig, (ax1, ax2) = plt.subplots(2)

x = np.linspace(5, 10)
y = x ** 2

sns.barplot(x, y, ax=ax1)
ax1.xaxis.set_major_locator(ticker.MultipleLocator(5))
ax1.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f'))

ax2.bar(x, y, width = 0.1)
ax2.xaxis.set_major_locator(ticker.MultipleLocator(5))
ax2.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f'))

plt.show()

enter image description here

1 Ответ

3 голосов
/ 03 мая 2019

Seaborn's barplot - категоричный сюжет.Это означает, что он помещает столбцы в последовательные целочисленные позиции (0,1, ... N-1).Следовательно, если у вас есть N баров, ось будет в диапазоне от -0,5 до N-0,5.

Невозможно сказать морскому рогу размещать бары в разных положениях;но вы, конечно, можете подделать ярлыки, чтобы они выглядели как таковые.Например, чтобы маркировать каждый 5-й столбец значением от x:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from matplotlib import ticker

sns.set()

fig, ax = plt.subplots()

x = np.linspace(5, 10)
y = x ** 2

sns.barplot(x, y, ax=ax)
ax.xaxis.set_major_locator(ticker.FixedLocator(np.arange(0, len(x), 5)))
ax.xaxis.set_major_formatter(ticker.FixedFormatter(x[::5]))
ax.tick_params(axis="x", rotation=90)

plt.tight_layout()
plt.show()

enter image description here

И наоборот, можно строить категориальные графики с помощью matplotlib.Для этого нужно построить строки.

ax.bar(x.astype(str), y)
ax.xaxis.set_major_locator(ticker.FixedLocator(np.arange(0, len(x), 5)))
ax.xaxis.set_major_formatter(ticker.FixedFormatter(x[::5]))
ax.tick_params(axis="x", rotation=90)

enter image description here

Если вам нужен числовой гистограмма, т. Е. График, где каждый столбец находится наположение оси x, потребуется *1023*, чтобы использовать matplotlib.Это случай по умолчанию, также показанный в вопросе, где столбцы находятся в диапазоне от 5 до 10. Следует убедиться, что ширина столбцов меньше, чем разница между последовательными позициями x в этом случае.

ax.bar(x, y, width=np.diff(x).mean()*0.8)
ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f'))
ax.tick_params(axis="x", rotation=90)

enter image description here

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