2017-07-01 4 views
1

Ich erstellte ein einfaches Balkendiagramm mit matplotlib.pyplot und seaborn Bibliotheken. Ist es möglich, ein Farbschema von Balken so zu ändern, dass Balken, die höheren Zählwerten entsprechen, eine dunklere rote Farbe haben, während Balken niedriger Zählwerte helle rote Farben haben? Also, eine Art Heatmap, angewandt auf das Balkendiagramm. Wie kann ich es tun? Momentan habe ich zufällige Farben in meinem Zählplot.Balkendiagramm mit Heatmap-Farbpalette

df = 
    DeviceId Speed 
    1   30 
    1   35 
    1   31 
    2   20 
    2   25 
    3   80 

import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns 

%matplotlib inline 

result = df.groupby(["DeviceId"])['Speed'].aggregate(np.median).reset_index() 

plt.figure(figsize=(12,8)) 
sns.barplot(x="DeviceId", y="Speed", data=result) 
plt.ylabel('Median speed', fontsize=12) 
plt.xlabel('Device ID', fontsize=12) 
plt.xticks(rotation='vertical') 
plt.show() 

UPDATE:

Ich versuchte dies:

sns.barplot(x="DeviceId", y="Speed", data=result, palette=sns.cubehelix_palette(8)) 

aber dunklere Farben entsprechen nicht höher Zählwerte. Es sieht so aus, als würden die Farben den Balken mithilfe einer vordefinierten Farbpalette zufällig zugewiesen.

+0

einen Tippfehler es auf dieser Linie Befehl lautet: Ergebnis = df.groupby ([ „DeviceId“]) ‚Speed‘ ] .aggregate (np.median) .reset_index() ("]") – tagoma

+0

@edouard: Danke, behoben. – Dinosaurius

Antwort

2

Sie können die Farben gemäß einer Colormap erhalten, indem Sie eine Normalisierungsinstanz mit dem minimalen und maximalen Datenwert definieren und die Daten mit dieser Normalisierung und einem ausgewählten Colormap einer Farbe zuordnen. Hier die umgekehrte Kupfer Karte mit Sinn machen kann (siehe colormap reference)

norm = plt.Normalize(result["Speed"].values.min(), result["Speed"].values.max()) 
colors = plt.cm.copper_r(norm(result["Speed"])) 

Sie dann diese Farben in der BarPlot

sns.barplot(x="DeviceId", y="Speed", data=result, palette=colors) 

enter image description here

komplette Code, um das oben zu reproduzieren können:

u = u"""DeviceId Speed 
    1   30 
    1   35 
    1   31 
    2   20 
    2   25 
    3   80""" 

import io 
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns 

#%matplotlib inline 

df = pd.read_csv(io.StringIO(u), delim_whitespace=True) 
result = df.groupby(["DeviceId"])['Speed'].aggregate(np.median).reset_index() 

norm = plt.Normalize(result["Speed"].values.min(), result["Speed"].values.max()) 
colors = plt.cm.copper_r(norm(result["Speed"])) 

plt.figure(figsize=(12,8)) 
sns.barplot(x="DeviceId", y="Speed", data=result, palette=colors) 
plt.ylabel('Median speed', fontsize=12) 
plt.xlabel('Device ID', fontsize=12) 
plt.xticks(rotation='vertical') 
plt.show() 

Normalisierung von 0 auf kann auch einen schönen Effekt mit einem der sequentiellen Farbtabellen haben,

norm = plt.Normalize(0, result["Speed"].values.max()) 
colors = plt.cm.Purples(norm(result["Speed"])) 

enter image description here

+0

Großartig. Wie kann ich eine rote Farbkarte erstellen? – Dinosaurius

+1

Vielleicht schauen Sie in die Colormaps aus dem bereitgestellten Link und probieren Sie es aus. Wenn das Ergebnis nicht Ihren Vorstellungen entspricht, fragen Sie etwas genauer danach. – ImportanceOfBeingErnest