【问题标题】:vary the color of each bar in bargraph using particular value使用特定值改变条形图中每个条形的颜色
【发布时间】:2013-09-25 01:45:33
【问题描述】:

我有如下条形图:http://matplotlib.org/examples/api/barchart_demo.html

在这种情况下,我们假设 G1-G5 组中的每一个代表每组中的男性在某项考试中获得的平均分数,而每组中的女性在相同的考试中获得的平均分数。

现在假设我有一些与每个组相关的其他功能(平均可爱度(浮动在 1-5 之间))。

Ex: Avg Likability of men in G1 - 1.33
                   Avg Likability of women in G1 - 4.6
                   Avg Likability of men in G2- 5.0
                   .... etc...

让我们假设 1 - 不讨人喜欢和 5 - 非常讨人喜欢

我想知道如何通过更改颜色示例的明暗度来将这种讨人喜欢的特性融入到每个条中: 由于上例中第 1 组的男性有 1.33,因此他们的图表将比 G2 的男性更浅的红色阴影,因为 G2 的男性有 5.0 的好感度,他们的条形图将是图表中最深的红色阴影,并且女人也一样。

我希望我已经说清楚了。如果有人能指出 matplotlib 中可以实现这一目标的资源,我将不胜感激,因为我对这个包非常陌生。

提前致谢。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    bar 将颜色列表作为参数(docs)。只需传入您想要的颜色即可。

    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    from matplotlib.colors import Normalize
    from numpy.random import rand
    
    fig, ax = plt.subplots(1, 1)
    # get a color map
    my_cmap = cm.get_cmap('jet')
    # get normalize function (takes data in range [vmin, vmax] -> [0, 1])
    my_norm = Normalize(vmin=0, vmax=5)
    # some boring fake data
    my_data = 5*rand(5)
    ax.bar(range(5), rand(5), color=my_cmap(my_norm(my_data)))
    
    plt.show()
    

    【讨论】:

    • 对,但是在这里,条形图的颜色取决于它在 y 轴上的值,该值作为列表传递给条形图。我想为每个条添加一个附加功能,其中条的颜色表示评级(例如,如果我们谈论每周餐厅评论的数量,条的颜色将是给定评论的正面或负面周(正面是粉红色,负面是红色什么的)有什么办法可以做到这一点吗?
    • 请重新阅读答案(并查看编辑以使其更清晰)。这正是你想要的。
    • 这正是你想要的。该图肯定不像操作要求的任何东西。
    • @7stud 我认为 OP 足够聪明,可以理解颜色图。
    • @tacaswell 请你帮我看看如何显示颜色图。
    【解决方案2】:
    import matplotlib.pyplot as plt
    import matplotlib as mp
    import numpy as np
    
    
    xs = "ABCDEFGHI"
    ys = [5, 6, 7, 8, 9, 10, 11, 12, 13]
    
    
    #Colorize the graph based on likeability:
    
    likeability_scores = np.array([
        5, 4.5, 3.5,
        2.5, 1.5, .5,
        2, 3, 4,
    ])
    
    data_normalizer = mp.colors.Normalize()
    color_map = mp.colors.LinearSegmentedColormap(
        "my_map",
        { 
            "red": [(0, 1.0, 1.0),
                    (1.0, .5, .5)],
    
            "green": [(0, 0, 0),
                      (1.0, 0, 0)],
    
            "blue": [(0, 0, 0),
                     (1.0, 0, 0)]
        }
    
    )
    
    #Map xs to numbers:
    N = len(xs)
    x_nums = np.arange(1, N+1)
    
    #Plot a bar graph:
    plt.bar(
        x_nums,
        ys,
        align="center",
        color=color_map(data_normalizer(likeability_scores))
    )
    
    #Change x numbers back to strings:
    plt.xticks(x_nums, xs)
    
    plt.show()
    
    --output:--
    

    r,g,b 值从 0-1 运行。这是红色的映射:

           "red": [(0, 1.0, 1.0),
                   (1.0, .5, .5)],
    

    每个元组中的第一个元素指定归一化的喜爱度得分。每个元组中的第二个元素指定红色的阴影 (0-1)。每个元组中的第三个元素用于更复杂的东西,所以这里它总是与第二个元素相同。

    红色映射指定 0-1.0(每个元组的第一个元素)之间的归一化相似度得分将映射到 100% 红色到 50% 红色的范围(每个元组中的第二个元素)。归一化的喜爱度得分为 0 将被映射到 100% 的红色,而归一化的喜爱度得分为 1.0 将被映射到 50% 的红色。将最深的红色设置为 50% 可防止红色变得太暗以至于看起来呈棕色或黑色。

    您可以根据需要指定任意数量的元组 - 您只需确保为标准化的喜爱度分数的整个范围 (0-1) 分配红色值,例如:

           "red": [(0, .5, .5),
                   (.8, .6, .6),
                   (1.0, .9, .9)],
    

    你不能这样做:

           "red": [(0, .5, .5),
                   (.8, 1.0, 1.0)],
    

    【讨论】:

      【解决方案3】:
      import pandas as pd
      import matplotlib.pyplot as plt  
      
      df = pd.DataFrame([1,2,3,4], [1,2,3,4])   
      color = ['red','blue','green','orange']
      df.plot(kind='bar', y=0, color=color, legend=False, rot=0)
      

      【讨论】:

        猜你喜欢
        • 2012-10-18
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多