Как установить диапазон оси X для точки морского побережья? - PullRequest
1 голос
/ 12 апреля 2019

Я создал 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")

enter image description here

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

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

    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

Ответы [ 3 ]

2 голосов
/ 12 апреля 2019

ИМХО, seaborn's pointplot - это не тот участок, который вы ищете.

Я бы предложил простой lineplot, а затем ваша попытка установить работу xlims, как ожидалось:

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")

ведет к

enter image description here

Однако я также рекомендовал бы установить xticks в этом контексте для некоторого списка со значениями 12 , в то время как 0 ... 12 имеет 13 ... ;-)

1 голос
/ 12 апреля 2019

Похоже, проблема в том, что ваши данные меняются только между месяцами 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()

Это даст

enter image description here

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

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

, который

enter image description here

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

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

Что даст вам

enter image description here

1 голос
/ 12 апреля 2019

Это что-то вроде хака, но, похоже, работает.Я считаю, что проблема в том, что 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.

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