我正在尝试用2个子图构建一个图。
如果项目位于ax
和ax1
,则栏的颜色为蓝色
如果该项目位于ax
而不是ax1
,则条形颜色应为绿色
如果该项目不在ax
且在ax1
中,则条形颜色应为红色。
所以在我的例子中:
栏Exploit
应为绿色,XSS
应为红色。
有没有办法用Matplotlib做到这一点?
以下是代码:
import matplotlib.pyplot as plt
from collections import OrderedDict
from matplotlib.backends.backend_pdf import PdfPages
from Processesing import dataProcess
from Sizeconvertor import Szconv
def chartmak (curvdic,prevdic,imgname,unit) :
Colors =[]
ImgName=imgname
D={}
D1={}
D=curvdic
D1=prevdic
if len(D):
listo=list(D.items())
listo1=list(D1.items())
if len(listo) < 10:
listo.extend([('', 0)] * (10 - len(listo)))
if len(listo1) < 10:
listo1.extend([('', 0)] * (10 - len(listo1)))
values1 = [v for l, v in listo1]
values = [v for l, v in listo]
Dict=listo
Dict1=listo1
fig, (ax,ax1) = plt.subplots(ncols=2,figsize=(12, 5))
n = len(Dict)
n1 = len(Dict1)
#--------------add the 1 barchart
ax.barh(range(n), values, align='center', fc='#80d0f1', ec='w')
ax.set_yticks(range(n))
ax.set_yticklabels(['' if e == 0 else Szconv(e,unit) for e in values], color='gray')# add the unit
ax.tick_params(pad=10)
for i, (label, val) in enumerate(Dict):
ax.annotate(label.title(), xy=(10, i), fontsize=10, va='center')
for spine in ('top', 'right', 'bottom', 'left'):
ax.spines[spine].set_visible(False)
ax.xaxis.set_ticks([])
ax.yaxis.set_tick_params(length=0)
ax.invert_yaxis()
ax.set_title('curmonth')
#----------add the secound plot
ax1.barh(range(n1), values1, align='center', fc='#80d0f1', ec='w')
ax1.set_yticks(range(n1))
ax1.set_yticklabels(['' if e == 0 else Szconv(e,unit) for e in values1], color='gray')#this need more work to put the GB or the TB
ax1.tick_params(pad=10)
for i, (label, val) in enumerate(Dict1):
ax1.annotate(label.title(), xy=(10, i), fontsize=10, va='center')
for spine in ('top', 'right', 'bottom', 'left'):
ax1.spines[spine].set_visible(False)
ax1.xaxis.set_ticks([])
ax1.yaxis.set_tick_params(length=0)
ax1.invert_yaxis()
ax1.set_title('PrevMonth')
#---------------------------------------------------------------------
#fig.set_size_inches(4, 3.5)
plt.savefig("BarChart/"+ImgName,bbox_inches='tight')
plt.show()
Testdic =OrderedDict([('Exploit', 14664), ('Botnet', 123), ('Virus', 52)])
Testdic2 =OrderedDict([('Botnet', 1252), ('Virus', 600), ('XSS', 452)])
imgname="TestImageformt.png"
unit = "transaction"
chartmak(Testdic,Testdic2,imgname,unit)
答案 0 :(得分:1)
您可以根据条件更改Rectangle
根据barh
创建的ax.patch[i].set_color('r')
补丁的颜色。
我稍微修改了你的代码以删除一些不必要的部分并让它运行。我希望它清楚地表明它在做什么。例如,您可以使用i
将修补程序import matplotlib.pyplot as plt
from collections import OrderedDict
fig,(ax1,ax2) = plt.subplots(1,2)
Testdic1 =OrderedDict([('Exploit', 14664), ('Botnet', 123), ('Virus', 52)])
Testdic2 =OrderedDict([('Botnet', 1252), ('Virus', 600), ('XSS', 452)])
list1 = list(Testdic1.items())
list2 = list(Testdic2.items())
n1 = len(list1)
n2 = len(list2)
values1 = [v for l,v in list1]
values2 = [v for l,v in list2]
ax1.barh(range(n1),values1,align='center', fc='#80d0f1', ec='w')
ax2.barh(range(n2),values2,align='center', fc='#80d0f1', ec='w')
# ====================================
# Here's where we change colors
# ====================================
for i,(label,val) in enumerate(list1):
if label.title() in Testdic2:
pass # leave it blue
else:
ax1.patches[i].set_color('g')
for i,(label,val) in enumerate(list2):
if label.title() in Testdic1:
pass # leave it blue
else:
ax2.patches[i].set_color('r')
# ====================================
ax1.set_yticks(range(n1))
ax2.set_yticks(range(n2))
for i, (label, val) in enumerate(list1):
ax1.annotate(label.title(), xy=(10, i), fontsize=10, va='center')
for i, (label, val) in enumerate(list2):
ax2.annotate(label.title(), xy=(10, i), fontsize=10, va='center')
ax1.invert_yaxis()
ax2.invert_yaxis()
plt.show()
的颜色更改为红色。
char fname[200+200];
strcat(fname, str);
strcat(fname, str2);
out_file = fopen(fname, "w");