2016-08-13 9 views
6

Aby dodać gradient tła, można szybko przejrzeć tabelę wyników. Jednak jest on stosowany zarówno wierszowo, jak i kolumnowo. Czy byłoby możliwe jednoczesne zastosowanie go do całej karty danych?Gradient tła w stylu pandy w obu wierszach i kolumnach

EDIT: minimum przykład praca:

df = pd.DataFrame([[3,2,10,4],[20,1,3,2],[5,4,6,1]]) 
df.style.background_gradient() 
+0

Czy spróbować ustawić oś '= None'? –

+0

Zrobiłem to teraz, ale to powoduje błąd. Dobry pomysł jednak ;-) – Peter9192

+0

Jaki błąd? Czy możesz udostępnić swój kod i mały fragment ramki danych? –

Odpowiedz

6

Obecnie nie można ustawić background_gradient dla obu rzędów/kolumn jednocześnie, jak wskazał przez Nickil Maveli. Sztuką jest, aby dostosować pandas function background_gradient:

import pandas as pd 
import matplotlib.pyplot as plt 
from matplotlib import colors 

def background_gradient(s, m, M, cmap='PuBu', low=0, high=0): 
    rng = M - m 
    norm = colors.Normalize(m - (rng * low), 
          M + (rng * high)) 
    normed = norm(s.values) 
    c = [colors.rgb2hex(x) for x in plt.cm.get_cmap(cmap)(normed)] 
    return ['background-color: %s' % color for color in c] 

df = pd.DataFrame([[3,2,10,4],[20,1,3,2],[5,4,6,1]]) 
df.style.apply(background_gradient, 
       cmap='PuBu', 
       m=df.min().min(), 
       M=df.max().max(), 
       low=0, 
       high=0.2) 
3

Można użyć axis=None aby pozbyć się min i max obliczeń w zaproszeniu:

def background_gradient(s, m=None, M=None, cmap='PuBu', low=0, high=0): 
    print(s.shape) 
    if m is None: 
     m = s.min().min() 
    if M is None: 
     M = s.max().max() 
    rng = M - m 
    norm = colors.Normalize(m - (rng * low), 
          M + (rng * high)) 
    normed = s.apply(norm) 
    cm = plt.cm.get_cmap(cmap) 
    c = normed.applymap(lambda x: colors.rgb2hex(cm(x))) 
    ret = c.applymap(lambda x: 'background-color: %s' % x) 
    return ret 


df.style.apply(background_gradient, axis=None) 
Powiązane problemy