【问题标题】:Why background_gradient is not working for two different colors?为什么 background_gradient 不适用于两种不同的颜色?
【发布时间】:2021-10-11 18:11:41
【问题描述】:

我正在尝试为不同的列设置不同颜色的背景渐变。为什么最后一种颜色会覆盖之前的颜色?如何保持两种颜色?

import pandas as pd
import numpy as np
arrays = [np.hstack([['One']*2, ['Two']*2]) , ['A', 'B', 'A', 'B']]
columns = pd.MultiIndex.from_arrays(arrays)
data =  pd.DataFrame(np.random.randn(5, 4), columns=list('ABCD'))
data.columns = columns 
import seaborn as sns
cm = sns.light_palette("green", as_cmap=True)
cc = sns.light_palette("red", as_cmap=True)
data.style.background_gradient(cmap=cm, subset=data.columns.get_loc_level('A', level=1)[0])
data.style.background_gradient(cmap=cc, subset=data.columns.get_loc_level('B', level=1)[0])

【问题讨论】:

    标签: python pandas numpy seaborn pandas-styles


    【解决方案1】:

    DataFrame.style 的每次调用都会生成一个唯一的样式器对象。这样同一个 DataFrame 就可以轻松地以不同方式设置样式,而不会相互影响。

    若要应用复合样式,或通常应用多个样式,请将返回的样式器存储为变量并重用它:

    cm = sns.light_palette("green", as_cmap=True)
    cc = sns.light_palette("red", as_cmap=True)
    styler = data.style  # Keep Styler for reuse
    styler.background_gradient(
        cmap=cm,
        subset=data.columns.get_loc_level('A', level=1)[0]
    )
    styler.background_gradient(
        cmap=cc,
        subset=data.columns.get_loc_level('B', level=1)[0]
    )
    

    或链接单个样式器对象:

    cm = sns.light_palette("green", as_cmap=True)
    cc = sns.light_palette("red", as_cmap=True)
    data.style.background_gradient(
        cmap=cm,
        subset=data.columns.get_loc_level('A', level=1)[0]
    ).background_gradient(
        cmap=cc,
        subset=data.columns.get_loc_level('B', level=1)[0]
    )
    

    两者都生成样式表:


    可以用种子 5 重现:

    import numpy as np
    import pandas as pd
    import seaborn as sns
    
    np.random.seed(5)
    data = pd.DataFrame(
        np.random.randn(5, 4),
        columns=pd.MultiIndex.from_product([['One', 'Two'], ['A', 'B']])
    )
    

    【讨论】:

    • 谢谢。很好的答案!还有一个问题,是否可以将这些颜色导出到excel? data.to_excel('colorful.xlsx') 不工作!
    • 样式化的数据框是独立于数据框或其他样式器的对象。应用样式后调用样式器对象上的 excel。 styler.to_excel(…) 或添加到链的末尾。
    • 您可以为此使用 IndexSlice:ix=pd.IndexSlice,然后是 subset=ix[:, ix[:, "A"]]"B"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多