Как установить диапазон оси x для точечной диаграммы seaborn?

#python #matplotlib #seaborn

#python #matplotlib #сиборн

Вопрос:

Я создал pointplot() и не могу изменить ограничение по оси x. Хотя мои данные содержат только 9 месяцев, я хочу показать все 12 на моей оси.

 fig,ax = plt.subplots(figsize=(12,4))
sns.pointplot(data=tr_df, x='Month', y='numOfTrips', hue='Year', ax=ax, palette='nipy_spectral')
# sns.plt.xlim(0, 12) # AttributeError: module 'seaborn' has no attribute 'plt'
# ax.set_xlim=(0, 12) # does nothing
ax.set(xlim=(0, 12))
ax.set(title="Number of trips each month")
  

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

Что я делаю не так?

Редактировать: данные, используемые для создания графика

     Year Month numOfTrips
0   2011   7     2608
1   2011   8     33579
2   2011   9     34756
3   2011   10    31423
4   2011   11    20746
5   2012   3     12240
6   2012   4     37637
7   2012   5     46056
8   2012   6     48315
9   2012   7     61659
10  2012   8     75443
11  2012   9     73012
12  2012   10    67372
13  2012   11    40862
14  2013   4     56625
15  2013   5     88105
16  2013   6     99301
17  2013   7     92504
  

Комментарии:

1. Если вы включите некоторые данные в свои, людям будет легче ответить на ваш вопрос — можете ли вы это сделать?

2. Похоже, что это работает, но проблема заключается в интерпретации тиков.. Я пытаюсь найти решение, но тем временем это может направить вас в правильном направлении. Я думаю, что точечная диаграмма по умолчанию обрабатывает ось x как катагорическое значение, и поэтому она просто игнорирует фактическое значение ваших данных

Ответ №1:

ИМХО, seaborn — это pointplot не тот график, который вы ищете.

Я бы предложил простой lineplot , тогда ваша попытка настроить xlim работает так, как ожидалось:

 fig,ax = plt.subplots(figsize=(12,4))
sns.lineplot(data=tr_df, x='Month', y='numOfTrips', hue='Year', ax=ax, palette='nipy_spectral')
ax.set(xlim=(0, 12))
ax.set(title="Number of trips each month")
  

приводит к

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

Тем не менее, я бы также рекомендовал установить xticks в этом контексте в некоторый список с 12 значениями, в то время как 0 … 12 имеет 13 … 😉

Комментарии:

1. Спасибо за ваш ответ! Как вы думаете, почему pointplots это не лучший выбор здесь? Я предполагаю, потому numOfTrips что является количественным и poinplots используется для сравнения категориальных переменных?

2. Я признаю, что я также догадался о чем-то подобном (как я также упоминал в своем первом редактировании). Но после проверки документов я не думаю, что это так. pointplot просто чувствовал себя не так естественно, как lineplot для меня, и в вашем случае это чувство явно намекало в правильном направлении, потому pointplot что, похоже, обрабатывает оси по-разному. Однако я не знаю, в чем именно заключается соответствующая разница, что приводит к вашей проблеме, извините.

Ответ №2:

Это немного взлом, но, похоже, работает. Я считаю, что проблема в том, что pointplot игнорируется числовое значение оси и рассматривается как порядковый номер. Этот код переопределяется вручную:

 fig,ax = plt.subplots(figsize=(12,4))
sns.pointplot(data=tr_df, x='Month', y='numOfTrips', hue='Year', ax=ax, palette='nipy_spectral')
ax.set_xticks(range(-3,10))
ax.set_xticklabels(range(12))
ax.set(title="Number of trips each month")
  

Вы в основном заставляете график добавлять больше тиков влево и вправо (используя значения минус), а затем переименовываете все метки с 1 по 12.

Ответ №3:

Похоже, проблема в том, что ваши данные меняются только между месяцами 3 и 11. Затем индексация месяца начинается с 3, и это соответствует xmin . Пример, который показывает это с использованием некоторых случайных данных (я сгенерировал их до того, как вы добавили данные):

 import seaborn as sns
import pandas as pd
import numpy as np

y = [2011,2012,2013]
years = []
months = []
trips = []
np.random.seed(0)
for ii in range(27):
    years.append(y[ii / 9])
    months.append(ii % 9 3)
    trips.append(np.random.randint(0,10) (ii / 12)*10)

tr_df = pd.DataFrame({'Month':months, 'Trips':trips, 'Year':years})
fig,ax = plt.subplots(figsize=(12,4))
sns.pointplot(data=tr_df, x='Month', y='Trips', hue='Year', ax=ax, 
              palette='nipy_spectral', scale=0.7)
ax.set(xlim=(0, 12))
ax.set(title="Number of trips each month")
plt.show()
  

Это приведет к

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

Самый простой способ исправить это (хотя он не исправляет базовые данные и не будет работать во всех случаях) — просто установить ограничения вручную для учета смещения —

 ax.set(xlim=(-0.5, 8.5))
  

Что даст вам

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

Если вы хотите включить месяцы ниже минимального (т.Е. 0,1,2), Вы можете установить xticks и xticklabels вручную —

 ax.set_xticks(range(-3,9))
ax.set_xticklabels(range(0,12))
  

Что даст вам

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