Сетка гистограммы Matplotlib - PullRequest
0 голосов
/ 18 апреля 2020

В настоящее время я работаю с большим набором данных и пытаюсь создать гистограмму для каждого из 13 столбцов с нанесенной на график функцией плотности вероятности.

Ниже приведен код, с которым я пытался:

for i, col in enumerate(df.columns):
    plt.figure(i)
    plt.hist(df[col], density=True, bins='auto')
    mn, mx = plt.xlim()
    plt.xlim(mn, mx)
    kde_xs = np.linspace(mn, mx, 301)
    kde = st.gaussian_kde(df[col], bw_method=0.06)
    plt.plot(kde_xs, kde.pdf(kde_xs), label="PDF")
    plt.legend(loc="upper left")
    plt.ylabel('Density')
plt.show()

Код внутри для l oop работает при применении к отдельным столбцам, но при размещении в l oop, как указано выше, выдает следующую ошибку:

Traceback (most recent call last):
  File "C:/Users/Adam-User/PycharmProjects/FinalYearProject/Final/5.1 Histogram.py", line 47, in <module>
    kde = st.gaussian_kde(df[col], bw_method=0.06)
  File "C:\Users\Adam-User\PycharmProjects\FinalYearProject\venv\lib\site-packages\scipy\stats\kde.py", line 209, in __init__
    self.set_bandwidth(bw_method=bw_method)
  File "C:\Users\Adam-User\PycharmProjects\FinalYearProject\venv\lib\site-packages\scipy\stats\kde.py", line 565, in set_bandwidth
    self._compute_covariance()
  File "C:\Users\Adam-User\PycharmProjects\FinalYearProject\venv\lib\site-packages\scipy\stats\kde.py", line 576, in _compute_covariance
    aweights=self.weights))
  File "<__array_function__ internals>", line 6, in cov
  File "C:\Users\Adam-User\PycharmProjects\FinalYearProject\venv\lib\site-packages\numpy\lib\function_base.py", line 2431, in cov
    avg, w_sum = average(X, axis=1, weights=w, returned=True)
  File "<__array_function__ internals>", line 6, in average
  File "C:\Users\Adam-User\PycharmProjects\FinalYearProject\venv\lib\site-packages\numpy\lib\function_base.py", line 417, in average
    scl = wgt.sum(axis=axis, dtype=result_dtype)
  File "C:\Users\Adam-User\PycharmProjects\FinalYearProject\venv\lib\site-packages\numpy\core\_methods.py", line 38, in _sum
    return umr_sum(a, axis, dtype, out, keepdims, initial, where)
TypeError: No loop matching the specified signature and casting was found for ufunc add

Любые идеи, как Я мог бы это исправить?

Спасибо за помощь заранее!

1 Ответ

0 голосов
/ 18 апреля 2020

Замените plt.figure(i) на эту строку:

plt.subplot(3, 5, i + 1)

Это создаст 3-рядную, 5-столбцовую сетку вспомогательных участков. Конечно, вы можете выбрать разные числа, если их продукт не меньше предполагаемого количества участков. Субплоты подсчитываются, начиная с 1, а не с 0, следовательно, i + 1.

Все последующие команды построения будут назначены i+1 -ым осям, т. Е. Отрисованы на этом субплоте, пока не будет вызван plt.subplot(). снова в следующей итерации l oop. Поэтому вам не нужно ничего менять в своем коде.


Редактировать:

Давайте проверим это с помощью набора данных радужной оболочки моря. Он содержит четыре столбца непрерывных измерений и один категориальный столбец.

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats as st

df = sns.load_dataset("iris")
df = df.drop('species', axis=1)  # drop the categorical column

# following code is exactly as in the question, 
# except for the one changed line I suggested
for i, col in enumerate(df.columns):
    plt.subplot(2, 2, i + 1)  # as discussed above
    plt.hist(df[col], density=True, bins='auto')
    mn, mx = plt.xlim()
    plt.xlim(mn, mx)
    kde_xs = np.linspace(mn, mx, 301)
    kde = st.gaussian_kde(df[col], bw_method=0.06)
    plt.plot(kde_xs, kde.pdf(kde_xs), label="PDF")
    plt.legend(loc="upper left")
    plt.ylabel('Density')
plt.show()

demo plots

...