2016-08-04 10 views
3

Für umfangreiche Plot-Skripts verwende ich matplotlibs rcParams, um einige Standard-Plot-Einstellungen für Pandas DataFrames zu konfigurieren.Pandas DataFrame Plot: Ständige Änderung der Standard-Farbpalette

Das funktioniert gut für Farben und Schriftgrößen, aber nicht für die Standard-colormap wie here

mein aktueller Ansatz hier:

# -*- coding: utf-8 -*- 
import pandas as pd 
import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib import cm 


# global plotting options 
plt.rcParams.update(plt.rcParamsDefault) 
matplotlib.style.use('ggplot') 
plt.rcParams['lines.linewidth'] = 2.5 
plt.rcParams['axes.facecolor'] = 'silver' 
plt.rcParams['xtick.color'] = 'k' 
plt.rcParams['ytick.color'] = 'k' 
plt.rcParams['text.color'] = 'k' 
plt.rcParams['axes.labelcolor'] = 'k' 
plt.rcParams.update({'font.size': 10}) 
plt.rcParams['image.cmap'] = 'Blues' # this doesn't show any effect 


# dataframe with random data 
df = pd.DataFrame(np.random.rand(10, 3)) 

# this shows the standard colormap 
df.plot(kind='bar') 
plt.show() 

# this shows the right colormap 
df.plot(kind='bar', cmap=cm.get_cmap('Blues')) 
plt.show() 

Die erste Handlung nicht die colormap über colormap (was es nicht verwendet sollte normalerweise tun): enter image description here

es funktioniert nur, wenn ich es als Argument wie in dem zweiten Grundstück passieren:

enter image description here

Gibt es eine Möglichkeit, die Standard-Colormap für Pandas DataFrame Plots dauerhaft zu definieren?

Vielen Dank im Voraus!

Antwort

1

Es gibt keinen unterstützten, offiziellen Weg, dies zu tun; Sie sind wegen der Pandas internen _get_standard_colors function stecken, die die Verwendung von matplotlib.rcParams['axes.color_cycle'] und fällt zurück auf list('bgrcmyk') Hardcodes:

colors = list(plt.rcParams.get('axes.color_cycle', 
           list('bgrcmyk'))) 

Es gibt verschiedene Hacks Sie jedoch verwenden können; eine der einfachsten, die für alle pandas.DataFrame.plot() Anrufe funktioniert, ist pandas.tools.plotting.plot_frame einzuwickeln:

import matplotlib 
import pandas as pd 
import pandas.tools.plotting as pdplot 

def plot_with_matplotlib_cmap(*args, **kwargs): 
    kwargs.setdefault("colormap", matplotlib.rcParams.get("image.cmap", "Blues")) 
    return pdplot.plot_frame_orig(*args, **kwargs) 

pdplot.plot_frame_orig = pdplot.plot_frame 
pdplot.plot_frame = plot_with_matplotlib_cmap 
pd.DataFrame.plot = pdplot.plot_frame 

in einem Notebook zu testen:

%matplotlib inline 
import pandas as pd, numpy as np 
df = pd.DataFrame(np.random.random((1000,10))).plot() 

... ergibt:

blue_plot