Матрица рассеяния Pandas

#python #pandas #matplotlib #scatter-plot

#python #pandas #matplotlib #точечный график

Вопрос:

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

 ax1 = scatter_matrix(entireColumns,color='Blue', alpha=0.4, figsize=(20, 20), diagonal='hist')
ax2 = scatter_matrix(selectedPoints,color='Red', alpha=0.4, figsize=(20, 20), diagonal='hist',ax=ax1)
  

Но я получаю ошибку:

      57             ax1 = scatter_matrix(entireColumns,color='Blue', alpha=0.4, figsize=(20, 20), diagonal='hist')#hist_kwds={'bins':5}#'kde#,color=colors
---> 58             ax2 = scatter_matrix(selectedPoints,color='Red', alpha=0.4, figsize=(20, 20), diagonal='hist',ax=ax1)
     59             plt.show()
     60             #parallel_coordinates(entireColumns, subsetColumns[0],color=('#556270', '#4ECDC4', '#C7F464'))

/usr/local/lib/python3.5/dist-packages/pandas/plotting/_misc.py in scatter_matrix(frame, alpha, figsize, ax, grid, diagonal, marker, density_kwds, hist_kwds, range_padding, **kwds)
     82     for i, a in zip(lrange(n), df.columns):
     83         for j, b in zip(lrange(n), df.columns):
---> 84             ax = axes[i, j]
     85 
     86             if i == j:

IndexError: too many indices for array
  

Без аргумента ax печатаются оба:

введите описание изображения здесь

Комментарии:

1. Проблема в том, что ax1 возвращаемый из scatter_matrix объект представляет собой не один объект axis, а массив вложенных графиков размером 5×5. Поэтому вы не можете назначить весь массив подзаголовков как ax=ax1

2. @Bazingaa Должна быть полная логика, позволяющая ax представлять собой массив. Итак, в принципе, код здесь должен работать, и это ошибка в логике в pandas.построение графика, что это не так.

Ответ №1:

Это очень похоже на ошибку в pandas. Вот как это, вероятно, должно выглядеть вместо:

В pandas/plotting/_tools.py перейдите к строке 196. Код там выглядит следующим образом:

 if ax is None:
    fig = plt.figure(**fig_kw)
else:
    if is_list_like(ax):
        ax = _flatten(ax)
        if layout is not None:
            warnings.warn("When passing multiple axes, layout keyword is "
                          "ignored", UserWarning)
        if sharex or sharey:
            warnings.warn("When passing multiple axes, sharex and sharey "
                          "are ignored. These settings must be specified "
                          "when creating axes", UserWarning,
                          stacklevel=4)
        if len(ax) == naxes:
            fig = ax[0].get_figure()
            return fig, ax
        else:
            raise ValueError("The number of passed axes must be {0}, the "
                             "same as the output plot".format(naxes))
  

Замените ее на

 if ax is None:
    fig = plt.figure(**fig_kw)
else:
    if is_list_like(ax):
        fax = _flatten(ax)
        if layout is not None:
            warnings.warn("When passing multiple axes, layout keyword is "
                          "ignored", UserWarning)
        if sharex or sharey:
            warnings.warn("When passing multiple axes, sharex and sharey "
                          "are ignored. These settings must be specified "
                          "when creating axes", UserWarning,
                          stacklevel=4)
        if len(fax) == naxes:
            fig = fax[0].get_figure()
            if squeeze:
                return fig, fax
            else:
                return fig, ax
        else:
            raise ValueError("The number of passed axes must be {0}, the "
                             "same as the output plot".format(naxes))
  

Комментарии:

1. Привет, большое тебе спасибо. Возможно ли заменить ее в коде, чтобы мне не пришлось изменять код пакета? С наилучшими пожеланиями!

2. Должна быть возможность обезьяньего исправления этого. Т.е. скопируйте полную _subplots функцию в свой скрипт, внесите предлагаемые изменения, замените все внутренние вызовы функций соответствующими внешними и, наконец, назначьте измененную функцию как pandas.plotting._tools._subplots = _subplots .