如果满足条件,Matplotlib会更改条形颜色

时间:2016-01-20 10:58:40

标签: python matplotlib

enter image description here

我正在尝试用2个子图构建一个图。

如果项目位于axax1,则栏的颜色为蓝色 如果该项目位于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)

1 个答案:

答案 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");

enter image description here