#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))
Что даст вам