#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
.