2016-01-06 2 views
1

Я пытаюсь адаптировать следующую стратегию (взятую из here), чтобы отрегулировать размеры стержней в Matplotlib barplotsМодифицирования бар ширина и бар-позиция в Matplotlib штрихового участке (зацикливание по контейнерам)

# Iterate over bars 
for container in ax.containers: 
    # Each bar has a Rectangle element as child 
    for i,child in enumerate(container.get_children()): 
     # Reset the lower left point of each bar so that bar is centered 
     child.set_y(child.get_y()- 0.125 + 0.5-hs[i]/2) 
     # Attribute height to each Recatangle according to country's size 
     plt.setp(child, height=hs[i]) 

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

for container in axes.containers: 
     for size, child in zip(sizes, container.get_children()): 
      child.set_x(child.get_x()- 0.50 + 0.5-size/2) 
      plt.setp(child, width=size) 

эффект, который я получаю, что размер ширины брусков (я использую в в штриховом графике, не HBAR) изменяется по назначению , но повторное центрирование применяется только к столбцам, которые соответствуют второму столбцу DataFrame (я их поменял, чтобы проверить), что соответствует более светлому синему на рисунке ниже.

enter image description here

Я не совсем понимаю, как это могло произойти, так как изменения, как представляется, применяются в рамках одного и того же цикла. Мне также трудно справиться с проблемами, поскольку в моем случае внешняя петля проходит через два контейнера, а внутренний цикл проходит через столько же детей, сколько и баров (и это для каждого контейнера).

Как я могу начать поиск и устранение неисправностей? И как я мог узнать, что я на самом деле зацикливаюсь? (Я знаю, что каждый ребенок представляет собой прямоугольник-объект, но это еще не сказать мне разницу между прямоугольниками в обоих контейнерах)

ответ

1

Видимо следующий подход работает лучше при изменении вертикальных тактовые участков:

for container in axes.containers: 
     for i, child in enumerate(container.get_children()): 
      child.set_x(df.index[i] - sizes[i]/2) 
      plt.setp(child, width=sizes[i]) 

Итак, основное отличие от первоначального подхода, который я адаптировал, заключается в том, что я не получаю текущую x_position контейнера, но повторно использую индекс DataFrame для установки x_position контейнера по индексу минус половина его нового ширина.

enter image description here

Смежные вопросы