Неожиданное поведение графика Seaborn в диапазоне xticks

avatar
Yuri Nassar
8 августа 2021 в 23:54
291
1
1

Я начинаю изучать панд и морских существ. Я тестирую линейный график, но ось X графика не показывает диапазон, который я ожидал для этого атрибута (num_of_elements). Я ожидал, что каждое значение этого атрибута отображается на оси x. Может кто-нибудь объяснить, чего мне не хватает в этом сюжете? Спасибо.

Вот код, который я использую:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import ticker

df_scability = pd.DataFrame()

df_scability['num_of_elements'] = [13,28,43,58,73,88,93,108,123,138]
df_scability['time_minutes'] = [2,3,5,7,20,30,40,50,60,90]
df_scability['dataset'] = ['Top 10 users','Top 10 users','Top 10 users','Top 10 users','Top 10 users','Top 10 users',
                           'Top 10 users','Top 10 users','Top 10 users','Top 10 users']

dpi = 600
fig = plt.figure(figsize=(3, 2),dpi=dpi)
ax = sns.lineplot(x = "num_of_elements", y = "time_minutes", hue='dataset', err_style='bars', data = df_scability)

ax.legend(loc='upper left', fontsize=4)
sns.despine(offset=0, trim=True, left=True)
ax.yaxis.set_major_locator(ticker.MultipleLocator(10))
ax.set_yticklabels(ax.get_ymajorticklabels(), fontsize = 6)
ax.yaxis.set_major_formatter(ticker.ScalarFormatter())
ax.set_xticklabels(ax.get_xmajorticklabels(), fontsize = 6)
ax.xaxis.set_major_formatter(ticker.ScalarFormatter())
plt.ylabel('AVG time (min)',fontsize=7)
plt.xlabel('Number of elements',fontsize=7)
plt.tight_layout()

plt.show()

Этот код генерирует для меня вывод: enter image description here

Источник

Ответы (1)

avatar
Zephyr
9 августа 2021 в 09:29
2

Строка:

sns.despine(offset=0, trim=True, left=True)

удаляет шипы с графика, что может вызвать путаницу. На самом деле ось X меняется с 6,75 на 144,25:

.
print(ax.get_xlim())
# (6.75, 144.25)

Но отображаются только галочки для 50 и 100 значений.
Таким образом, вы можете исправить диапазон оси x с помощью:

ax.set_xticks(range(0, 150 + 50, 50))

перед вызовом despine. 0 — самый низкий тик, 150 — самый высокий и 50 — шаг среди тиков. Вы можете адаптировать их под свои нужды.

Полный код

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import ticker

df_scability = pd.DataFrame()

df_scability['num_of_elements'] = [13,28,43,58,73,88,93,108,123,138]
df_scability['time_minutes'] = [2,3,5,7,20,30,40,50,60,90]
df_scability['dataset'] = ['Top 10 users','Top 10 users','Top 10 users','Top 10 users','Top 10 users','Top 10 users',
                           'Top 10 users','Top 10 users','Top 10 users','Top 10 users']

dpi = 600
fig = plt.figure(figsize=(3, 2),dpi=dpi)
ax = sns.lineplot(x = "num_of_elements", y = "time_minutes", hue='dataset', err_style='bars', data = df_scability)

ax.legend(loc='upper left', fontsize=4)
ax.set_xticks(range(0, 150 + 50, 50))
sns.despine(offset=0, trim=True, left=True)
ax.yaxis.set_major_locator(ticker.MultipleLocator(10))
ax.set_yticklabels(ax.get_ymajorticklabels(), fontsize = 6)
ax.yaxis.set_major_formatter(ticker.ScalarFormatter())
ax.set_xticklabels(ax.get_xmajorticklabels(), fontsize = 6)
ax.xaxis.set_major_formatter(ticker.ScalarFormatter())
plt.ylabel('AVG time (min)',fontsize=7)
plt.xlabel('Number of elements',fontsize=7)
plt.tight_layout()

plt.show()

enter image description here

Yuri Nassar
13 августа 2021 в 02:16
1

Спасибо @Zephyr. Это сработало для меня. Однако у меня есть вопрос по поводу клещей. Вы сказали, что despine удаляет шипы с графика, и отображаются только значения галочек 50 и 100. Я хотел бы показать точно каждое значение на оси x. Для этого я просто заменил диапазон значениями списка в 'num_of_elements'.

Zephyr
13 августа 2021 в 06:21
0

Да, вы можете передать ax.set_xticks список тиков, которые вы хотите отобразить