Случайные пустые места / столбцы на графике распределения морских волн - PullRequest
1 голос
/ 27 мая 2020

ЦЕЛЬ: Я хочу создать функцию распределения для возрастов зарегистрированных собак в 2017 году в Цюрихе из набора данных «Собаки Цюриха» (Kaggle) (с Python). Переменная, с которой я работаю - 'GEBURTSJAHR_HUND' - дает год рождения для каждой зарегистрированной собаки в виде int. Я преобразовал его в переменную dog_age (= 2017 - Birth_date) и хочу построить график функции распределения. См. Изображение ниже для отсортированного списка размеров группы по возрасту.

Размер возрастных групп собак

ПРОБЛЕМА: Я столкнулся с тем, что моя функция распределения x На оси есть пустые промежутки / полосы. Каждый возраст показан на графике, но между некоторыми из этих возрастов есть пустые столбцы. Пример: 1 и 2 - полные полосы, но между ними пустое пространство. Между 2 и 3 нет пустого места, а между 3 и 4 есть. Кажется случайным, какие значения имеют пробелы между ними.

Какая моя проблема c график распределения выглядит на данный момент

ПРОВЕРИЛ: Я ранее пробовал три вещи, чтобы исправьте это.

  1. plt.xticks (...) К сожалению, это изменило только эстетику оси x.
  2. Пробовал ax = sns.distplot с последующими линиями тикера ax.xaxis , но это не дало ожидаемого результата.
ax.xaxis.set_major_locator(ticker.MultipleLocator())
ax.xaxis.set_major_formatter(ticker.ScalarFormatter(0))
Может проблема с переменной dog_age? Использовалась исходная переменная Birth_date, но возникла та же проблема.

CODE:

dfnew = pd.read_csv(dog17_filepath,index_col='HALTER_ID')
dfnew.dropna(subset = ["ALTER"], inplace=True)
dfnew['dog_age'] = 2017 - dfnew['GEBURTSJAHR_HUND']
b = dfnew['dog_age']

sns.set_style("darkgrid")
plt.figure(figsize=(15,5))
sns.distplot(a=b,hist=True)
plt.xticks(np.arange(min(b), max(b)+1, 1))
plt.xlabel('Age Dog', fontsize=12)
plt.title('Distribution of age of dogs', fontsize=20)

plt.show()

Заранее спасибо,

Arthur

1 Ответ

2 голосов
/ 27 мая 2020

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

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

dfnew = pd.read_csv('hundehalter.csv')
dfnew.dropna(subset=["ALTER"], inplace=True)
dfnew['dog_age'] = 2017 - dfnew['GEBURTSJAHR_HUND']
b = dfnew['dog_age'][(dfnew['dog_age'] >= 0) & (dfnew['dog_age'] <= 25)]

sns.set_style("darkgrid")
plt.figure(figsize=(15, 5))
sns.distplot(a=b, hist=True, bins=np.arange(min(b)-0.5, max(b)+1, 1))
plt.xticks(np.arange(min(b), max(b) + 1, 1))
plt.xlabel('Age Dog', fontsize=12)
plt.title('Distribution of age of dogs', fontsize=20)
plt.xlim(min(b), max(b) + 1)
plt.show()

resulting plot

...