Seaborn, строящий график корреляции, терпит неудачу из-за не кортежной последовательности для устаревания многомерной индексации - PullRequest
0 голосов
/ 02 апреля 2019

Недавно я запустил новейшую версию anaconda (2018.12 с py37_0), и я использую ноутбуки jupyter для запуска своего кода. До установки этой версии я использовал Python 3.2.2, и код, представленный ниже, работал бы гладко. Код использует Seaborn для создания корреляционного графика с использованием переменных, взятых из кадра данных Pandas. Однако теперь я получаю «IndexError: индекс кортежа вне диапазона» и не знаю, как исправить эту ошибку.

О подобной проблеме сообщалось ранее:

FutureWarning: Использование последовательности без кортежей для многомерной индексации не рекомендуется использовать `arr [tuple (seq)]` вместо `arr [seq]`

FutureWarning: Использование последовательности без кортежей для многомерной индексации не рекомендуется использовать `arr [tuple (seq)]`

Мне кажется, что ни одно из этих решений не работает.

Наконец, код для построения корреляции для переменных в моем фрейме данных взят из:

График матрицы корреляции с коэффициентами на одной стороне, точками рассеяния на другой и распределениями по диагонали

Данные для создания кадра данных панд были взяты из CSV-файла соревнования Kaggle:

https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/

Я использовал файл "winequality-white.csv"

import pandas as np
import seaborn as sns
import numpy as np

df = pd.read_csv('winequality-white.csv')

def corrdot(*args, **kwargs):
    corr_r = args[0].corr(args[1], 'pearson')
    corr_text = f"{corr_r:2.2f}".replace("0.", ".")
    ax = plt.gca()
    ax.set_axis_off()
    marker_size = abs(corr_r) * 10000
    ax.scatter(.5, .5, marker_size, corr_r, alpha=0.6, cmap="coolwarm",
               vmin=-1, vmax=1, transform=ax.transAxes)
    font_size = abs(corr_r) * 40 + 5
    ax.annotate(corr_text, [.5, .5,],  xycoords="axes fraction",
                ha='center', va='center', fontsize=font_size)

sns.set(style='white', font_scale=1.6)

g = sns.PairGrid(df, aspect=1.4, diag_sharey=False)
g.map_lower(sns.regplot, lowess=True, ci=False, line_kws={'color': 'black'})
g.map_diag(sns.distplot, kde_kws={'color': 'black'})
g.map_upper(corrdot)

Ожидаемые результаты можно найти в ответе на:

График матрицы корреляции с коэффициентами на одной стороне, точечными диаграммами на другой и распределениями по диагонали

Фактические результаты:

C: \ Users \ Public \ anaconda3 \ lib \ site-packages \ scipy \ stats \ stats.py: 1713: FutureWarning: Использование последовательности без кортежей для многомерной индексации не рекомендуется; используйте arr[tuple(seq)] вместо arr[seq]. В будущем это будет интерпретироваться как индекс массива arr[np.array(seq)], что приведет либо к ошибке, либо к другому результату. return np.add.reduce (отсортировано [indexer] * веса, ось = ось) / sumval

Traceback:

IndexError                                Traceback (most recent call last)
<ipython-input-8-68b4a938aa72> in <module>
     17 g.map_lower(sns.regplot, lowess=True, ci=False, line_kws={'color': 'black'})
     18 g.map_diag(sns.distplot, kde_kws={'color': 'black'})
---> 19 g.map_upper(corrdot)

C:\Users\Public\anaconda3\lib\site-packages\seaborn\axisgrid.py in map_upper(self, func, **kwargs)
   1488                 color = self.palette[k] if kw_color is None else kw_color
   1489                 func(data_k[x_var], data_k[y_var], label=label_k,
-> 1490                      color=color, **kwargs)
   1491 
   1492             self._clean_axis(ax)

<ipython-input-8-68b4a938aa72> in corrdot(*args, **kwargs)
      7     marker_size = abs(corr_r) * 10000
      8     ax.scatter(.5, .5, marker_size, corr_r, alpha=0.6, cmap="coolwarm",
----> 9                vmin=-1, vmax=1, transform=ax.transAxes)
     10     font_size = abs(corr_r) * 40 + 5
     11     ax.annotate(corr_text, [.5, .5,],  xycoords="axes fraction",

C:\Users\Public\anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, data, *args, **kwargs)
   1808                         "the Matplotlib list!)" % (label_namer, func.__name__),
   1809                         RuntimeWarning, stacklevel=2)
-> 1810             return func(ax, *args, **kwargs)
   1811 
   1812         inner.__doc__ = _add_data_doc(inner.__doc__,

C:\Users\Public\anaconda3\lib\site-packages\matplotlib\axes\_axes.py in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, **kwargs)
   4209             try:  # First, does 'c' look suitable for value-mapping?
   4210                 c_array = np.asanyarray(c, dtype=float)
-> 4211                 n_elem = c_array.shape[0]
   4212                 if c_array.shape in xy_shape:
   4213                     c = np.ma.ravel(c_array)

IndexError: tuple index out of range

1 Ответ

0 голосов
/ 02 апреля 2019

Аргументами разброса должны быть списки или массивы.Следовательно, plt.scatter(1,1, c=1, vmin=0, vmax=2) не работает, но

plt.scatter([1],[1], c=[1], vmin=0, vmax=2)

будет работать.

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