【问题标题】:Using a Custom Color Palette in Stacked Bar Chart在堆积条形图中使用自定义调色板
【发布时间】:2016-12-04 15:51:06
【问题描述】:

所以我试图创建一个堆叠条形图,其中图表的所有切片将在整个程序中保持不变,但我不知道如何让 df.plot 使用自定义调色板。

我想确保如果我从这个程序中生成 20 份不同的报告,例如,冻结将始终为蓝色,而冰雹始终为白色。

请看下面的示例 - 首先,我正在为所有天气值创建一个自定义调色板。

当我使用“配对”调色板进行绘图时,它工作正常,如下所示:

这基本上是我想要的,除了使用自定义调色板

但是,当我这样做时

df.plot(kind='bar', stacked=True,colormap=pal_weather)

我收到一个以以下结尾的错误:

C:\Anaconda3\lib\site-packages\pandas\tools\plotting.py in _get_standard_colors(num_colors, colormap, color_type, color)
157             if colormap is None:
158                 raise ValueError("Colormap {0} is not recognized".format(cmap))
--> 159         colors = lmap(colormap, np.linspace(0, 1, num=num_colors))
    160     elif color is not None:
    161         if colormap is not None:

C:\Anaconda3\lib\site-packages\pandas\compat\__init__.py in lmap(*args, **kwargs)
    116 
    117     def lmap(*args, **kwargs):
-->  118         return list(map(*args, **kwargs))
    119 
    120     def lfilter(*args, **kwargs):

TypeError: 'dict' object is not callable

任何帮助将不胜感激

谢谢!

示例代码如下:

weather=('Day','Freeze', 'Wind', 'Flood', 'Quake', 'Hail')

pal_weather = dict(zip(weather, sns.color_palette("cubehelix", n_colors=len(weather))))

data1 = [[ "M", 66386,  174296,   75131,  577908,   32015],
    [  "T", 58230,  381139,   78045,   99308,  160454],
    [  "W", 89135,   80552,  152558,  497981,  603535],
    [  "T", 78415,   81858,  150656,  193263,   69638],
    [ "F", 139361,  331509,  343164,  781380,   52269]]


df = DataFrame(data=data1)
df.columns = ('Day','Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
df.plot(kind='bar', stacked=True,colormap='Paired')

【问题讨论】:

    标签: python pandas matplotlib stacked-chart


    【解决方案1】:

    试试我的解决方案:

    import matplotlib.pyplot as plt
    import matplotlib
    import seaborn as sns
    from matplotlib.colors import LinearSegmentedColormap
    
    matplotlib.style.use('ggplot')
    from pandas import DataFrame
    
    weather = ('Day', 'Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
    colors = sns.color_palette("cubehelix", n_colors=len(weather))
    cmap1 = LinearSegmentedColormap.from_list("my_colormap", colors)
    
    data1 = [["M", 66386, 174296, 75131, 577908, 32015],
             ["T", 58230, 381139, 78045, 99308, 160454],
             ["W", 89135, 80552, 152558, 497981, 603535],
             ["T", 78415, 81858, 150656, 193263, 69638],
             ["F", 139361, 331509, 343164, 781380, 52269]]
    
    
    df = DataFrame(data=data1)
    df.columns = weather
    df = df.set_index('Day')
    df.plot(kind='bar', stacked=True, colormap=cmap1)
    plt.show()
    

    输出:

    【讨论】:

    • 这似乎可行,但对于颜色实际上如何与天气值相关联有点困惑。请您解释一下吗?真的很感激。
    • market...有点困惑为什么...非常感谢帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多