Matplotlib/seaborn histogram using different colors for grouped bins

前端 未结 4 1376
谎友^
谎友^ 2021-01-12 16:09

I have this code, using a pandas df:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os


path_to = \'Data\\\\2017-04\\\\Mon         


        
相关标签:
4条回答
  • 2021-01-12 16:12

    A more readable general solution without using the cmap as you want just 3 colors for specific intervals.

    n, bins, patches = plt.hist(df1['Average'], 30)
    
    for c, p in zip(bins, patches):
        if c > 0 and c < 4:
            plt.setp(p, 'facecolor', 'green')
        elif c >= 4 and c < 14  :
            plt.setp(p, 'facecolor', 'blue')
        else c>=14:
            plt.setp(p, 'facecolor', 'yellow')
    
    plt.show()
    
    0 讨论(0)
  • 2021-01-12 16:19

    If you want to color specific divisions with specific colors and label them accordingly you can use the following code:

    import matplotlib.pyplot as plt
    import numpy             as np
    import seaborn as sns; sns.set(color_codes=True)
    
    number_of_bins = 20
    N, bins, patches = plt.hist(np.random.rand(1000), number_of_bins, rwidth=0.8)
    
    #Define the colors for your pathces (you can write them in any format):
    colors    = [(0, 0, 0), "b", "#ffff00", "red"]
    #Define the ranges of your patches:
    divisions = [range(1), range(1, 9), range(9, 14), range(14, 20)]
    #If you want to label the regions/divisions:
    labels    = ["Black", "Blue", "Yellow", "Red"]
    
    #for each division color the parches according to the specified colors:
    for d in divisions:
        patches[list(d)[0]].set_label(labels[divisions.index(d)])
        for i in d:
            patches[i].set_color(colors[divisions.index(d)])
    
    
    plt.title("Plot Title")
    plt.xlabel("X label")
    plt.ylabel("Y label")
    plt.legend(title="Legend Title")
    

    0 讨论(0)
  • 2021-01-12 16:22

    I recommend you to use the plt.hist() function 3 times, each with a different color. You can set the range of each histogramm using the range parameter of the function. The legend is genereated by using the label parameter followed by a subsequent call of plt.legend().

    0 讨论(0)
  • 2021-01-12 16:30

    Solution:

    N, bins, patches = plt.hist(df1['Average'], 30)
    
    cmap = plt.get_cmap('jet')
    low = cmap(0.5)
    medium =cmap(0.2)
    high = cmap(0.7)
    
    
    for i in range(0,3):
        patches[i].set_facecolor(low)
    for i in range(4,13):
        patches[i].set_facecolor(medium)
    for i in range(14,30):
        patches[i].set_facecolor(high)
    
    plt.xlabel("Watt Hours", fontsize=16)  
    plt.ylabel("Households", fontsize=16)
    plt.xticks(fontsize=14)  
    plt.yticks(fontsize=14)
    ax = plt.subplot(111)  
    ax.spines["top"].set_visible(False)  
    ax.spines["right"].set_visible(False)
    
    plt.show()
    

    output:

    0 讨论(0)
提交回复
热议问题