2013-11-21 3 views
6

У меня есть барный заговор, состоящий из 3 штабелей и 5 баров. Я хочу выделить один батон (все три сложенных элемента), изменив ширину линии.python + matplotlib: как я могу изменить ширину линии бара для одной строки?

Я рисую бруски с помощью следующей команды:

mybar = ax.bar(x,Y[:,i],bottom=x,color=colors[i],edgecolor='none',width=wi,linewidth = 0) 
bar_handles = np.append(bar_handles,mybar) 

У меня есть ручка для бара я хочу изменить хранюсь в массиве bar_handles, есть способ изменить бар edgecolor и linewidth недвижимости после того, как он был нарисован?

ответ

3

я в конечном итоге делаю это так:

ax.axvspan(X1, 
      X1+wi, 
      ymax=Y2, 
      facecolor='none', 
      edgecolor='black', 
      linewidth=2) 

... где

X1 = bar_handles[startBlock].get_x() 
wi = bar_handles[startBlock].get_width() 
Y2 = ax.transLimits.transform((0,bar_handles[startBlock].get_height()))[1] 

Это дает преимущество над моим баром - включая все элементы внутри - без горизонтали, как между элементами.

9

ax.bar возвращает Container художников; каждый «художник» - это Rectangle с set_linewidth и set_edgecolor методами.

Чтобы изменить настройки, скажем, второго бара в mybar, вы можете сделать это:

mybar[1].set_linewidth(4) 
mybar[1].set_edgecolor('r') 

Вот скрипт, который показывает, как это может быть использовано для изменения ширины линии стека:

import numpy as np 
import matplotlib.pyplot as plt 


x = np.array([1,2,3]) 
y1 = np.array([3,2.5,1]) 
y2 = np.array([4,3,2]) 
y3 = np.array([1,4,1]) 

width = 0.5 
handles = [] 
b1 = plt.bar(x, y1, color='#2040D0', width=width, linewidth=0) 
handles.append(b1) 
b2 = plt.bar(x, y2, bottom=y1, color='#60A0D0', width=width, linewidth=0) 
handles.append(b2) 
b3 = plt.bar(x, y3, bottom=y1+y2, color='#A0D0D0', width=width, linewidth=0) 
handles.append(b3) 

# Highlight the middle stack. 
for b in handles: 
    b[1].set_linewidth(3) 

plt.xlim(x[0]-0.5*width, x[-1]+1.5*width) 
plt.xticks(x+0.5*width, ['A', 'B', 'C']) 
plt.show() 

Этот сценарий создает следующую гистограмму:

stacked bar chart

+0

Спасибо, это заполнит только первый элемент на выбранном блоке (3 элемента сложены), см. Http://i.imgur.com/CKgOjTL.png – otmezger

+0

Конечно, это было только для того, чтобы вы начали. :) –

+0

Я добавил к моему ответу демо-скрипт. –