WedX - журнал о программировании и компьютерных науках

Доступ к дескрипторам объектов сюжета в сюжете, вызываемом через pandas

Я хотел бы использовать функцию построения столбцов с накоплением в pandas DataFrames. Тем не менее, я хотел бы продолжить, изменив только что построенные столбцы. Для этого мне нужен доступ к их графическим дескрипторам. Но все, что я получаю от df.plot(), - это дескриптор оси. Как мне получить список того, что было специально создано в конкретном вызове? Это было бы необходимо, например, если бы в тех же осях были ранее существовавшие объекты из более раннего графика, и я хотел бы их дифференцировать, т.е. обработать только новые. Вот мой код, который дважды отображает одну и ту же ось. Я хотел бы, чтобы сложенные столбцы были сгруппированы рядом друг с другом, поэтому я подумал, что могу просто сделать их немного уже и сдвинуть вправо и влево. Но для этого мне понадобятся дескрипторы того, что было сделано во втором вызове.

import random
import pandas as pd
import numpy as np
from pylab import *
close('all')
df = pd.DataFrame(np.random.random((7, 5)) * 10,               
                        index=list('abcdefg'), columns=list('ABCDE'))

print df

ax = df.plot(kind='bar', stacked=True, align='center')
c1=ax.containers
hh=findobj(ax,lambda xx:hasattr(xx,'width'))
setp(hh,'width',.3)
print hh

df2= pd.DataFrame(np.random.random((6, 5)) * 10,               
                        index=list('abcdef'), columns=list('FGHIJ'))

ax2 = df2.plot(kind='bar', stacked=True, align='center', ax=ax,colormap='bone')
c2=ax2.containers
print ax==ax2 # Should be true
c1==c2 # Should be False
show()

Я пытался получить список контейнеров ax.containers после первого вызова, а затем еще раз после второго и взять установленную разницу, но это не сработало.


  • На самом деле кажется, что если я использую list(gca().containers) в каждом случае, тогда он работает нормально, и set(c2)-set(c1) дает мне то, что я хочу. Так что я думаю, что это ответ на мой собственный вопрос. 23.02.2014

Ответы:


1

Вы ищете атрибут patches осей. Вы можете получить исходные позиции x с помощью [p.get_x() for p in ax.patches]. Это дает левую конечную точку для каждого патча.

Вы захотите добавить или вычесть некоторое значение для каждого из патчей. Что-то вроде: new_xs = [p.get_x() - .5 for p in ax.patches]. А затем set_x к новым значениям:

>>>for p, x in zip(ax.patches, new_xs):
       p.set_x(x)

Вам также, вероятно, потребуется расширить x_ticks или уменьшить ширину каждого патча с помощью p.set_width(). Просто может быть проще сделать все это через matplotlib, а не пытаться настроить то, что возвращает pandas.

20.02.2014
  • Спасибо. Может быть, я должен уточнить что-то еще или более четко. Да, на самом деле я использую цикл поверх патчей и set_x, как вы говорите. Но этот вопрос касается получения списка патчей, которые были недавно созданы с помощью графического вызова через pandas. Другими словами, я не думаю, что ваше предложение полезно для перемещения ВТОРОГО набора баров, но не первого. Это? 20.02.2014
  • в строке df2.plot() вы устанавливаете ax=ax, который изменяет предыдущий объект осей. Вы ax2 объект является ax. Так что в ax.patches будут патчи как из df.plots(). Вы можете получить новые, определив выполнение ax=df1.plot(...); old_patches = set(ax.patches). Затем сделайте df2.plot(ax=ax,...); new_patches=set(ax.patches) - old_patches. Это становится немного хакерским. 21.02.2014
  • Вы действительно пробовали это? Я добавил комментарий к своему вопросу, чтобы уточнить некоторые проблемы, которые привели к публикации. 21.02.2014
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]