В чем проблема с осью моего факториала? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть этот набор данных: kaggle: Цены на дома: передовые методы регрессии . Я загрузил его следующим образом:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

import seaborn as sns
import scipy.stats as st

train = pd.read_csv("train.csv")

Затем я попытался построить SalePrice с помощью YearBuilt, используя в качестве оттенка TotalQual:

plt.figure(figsize = [8, 6])
sns.factorplot(
    x = 'YearBuilt',
    y = 'SalePrice', 
    data = train,
    kind='swarm',
    hue='OverallQual',
    palette = 'Set2')

plt.title('House Sale Prices (log scale) vs. Year Built and Overall Quality')
plt.xticks([1880, 1900, 1920, 1940, 1960, 1980, 2000], ['1880', '1900', '1920', '1940', '1960', '1980', '2000'])
#plt.xlim([1872,2009])
plt.xlabel('Year Built')
plt.yscale('log')
#plt.ylim([4e4, 6e5])
plt.yticks([6e4, 1e5, 1.4e5, 1.8e5, 2.4e5, 3.2e5, 4e5, 6e5], ['60k', '100k', '140K', '180k', '240K', '320k', '600k'])
plt.ylabel('Sale Price ($)')
plt.show()

В результате на следующем графике:

Swarmplot

Если я добавлю xlim или ylim, график вообще не появится.

Я новичок в этом, поэтому любая помощь очень ценится.

1 Ответ

2 голосов
/ 31 марта 2020
plt.style.use('ggplot')
g = sns.catplot(
    x = 'YearBuilt',
    y = 'SalePrice',
    data = train,
    kind='swarm',
    hue='OverallQual',
    palette = 'Set2', height=6, aspect=2)

locs, labels = plt.xticks()  # use if needed, as explained below.

for axes in g.axes.flat:

    for ind, label in enumerate(axes.get_xticklabels()):
        if ind % 8 == 0:  # every nth label is kept
            label.set_visible(True)
        else:
            label.set_visible(False)


plt.title('House Sale Prices (log scale) vs. Year Built and Overall Quality')
plt.xlabel('Year Built')
plt.yscale('log')
plt.ylim([4e4, 6e5])
plt.yticks([6e4, 1e5, 1.4e5, 1.8e5, 2.4e5, 3.2e5, 4e5, 6e5], ['60k', '100k', '140K', '180k', '240K', '320k', '600k'])
plt.ylabel('Sale Price ($)')
plt.show()

enter image description here

Примечания:

  • sns.factorplot устарело для sns.catplot
  • Проблема plt.xticks([1880, 1900, 1920, 1940, 1960, 1980, 2000], ['1880', '1900', '1920', '1940', '1960', '1980', '2000']) пытается заменить 112 xticks и xticklabels
    • Используя locs, labels = plt.xticks(), locs - это список от 0 до 111, в то время как вы пытаетесь найти, это 1880-2000, поэтому все данные включены. левая сторона. По сути, диапазон xaxis теперь составляет от 0 до 2000.
    • Данные года - это просто int, а не datetime
  • Возможно, есть и другие способы сделайте это.

Альтернатива:

  • Создайте график, не изменяя xaxis, чтобы получить locs, labels = plt.xticks(). Ярлыки являются функцией генератора и могут быть распакованы с labels = [*labels].
  • type(labels[0]) равно matplotlib.text.Text, поэтому, чтобы получить список только меток, используйте label_t = [x.get_text() for x in labels].
  • Make список только местоположений указателей для нужных лет на оси
years = ['1880', '1900', '1920', '1940', '1960', '1980', '2000']
xticks = [label_t.index(year) for year in years]

print(xticks)
>>> [2, 9, 24, 43, 61, 81, 101]

Участок

plt.style.use('ggplot')
g = sns.catplot(
    x = 'YearBuilt',
    y = 'SalePrice',
    data = train,
    kind='swarm',
    hue='OverallQual',
    palette = 'Set2', height=6, aspect=2)

plt.title('House Sale Prices (log scale) vs. Year Built and Overall Quality')
plt.xticks(xticks, ['1880', '1900', '1920', '1940', '1960', '1980', '2000'])
# plt.xlim([1872,2009])
plt.xlabel('Year Built')
plt.yscale('log')
# plt.ylim([4e4, 6e5])
plt.yticks([6e4, 1e5, 1.4e5, 1.8e5, 2.4e5, 3.2e5, 4e5, 6e5], ['60k', '100k', '140K', '180k', '240K', '320k', '600k'])
plt.ylabel('Sale Price ($)')
plt.show()

enter image description here

  • Интервал между осями не равен даже тому, что не все годы указаны в наборе данных.
np.sort(train.YearBuilt.unique())

array([1872, 1875, 1880, 1882, 1885, 1890, 1892, 1893, 1898, 1900, 1904,
       1905, 1906, 1908, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917,
       1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928,
       1929, 1930, 1931, 1932, 1934, 1935, 1936, 1937, 1938, 1939, 1940,
       1941, 1942, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953,
       1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964,
       1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975,
       1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986,
       1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
       1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
       2009, 2010], dtype=int64)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...