2016-11-02 3 views
0

Ich versuche Barplot zu erzeugen, wo die Farben der Bars nach vorgegebenen Werten aus vordefinierten Farben ausgewählt werden. Der Wert "pahse" bestimmt die Farbe. Es ist in 3 Bereiche unterteilt und Bereiche sind geordnet. Rang wird verwendet, um eine Farbe aus der Palette aufzurufen. Dieser Teil funktioniert gut. Aber ich bin mit colorbar geblieben. Colorbar sollte Farben basierend auf den Schlüsseln des Wörterbuchs "rank_classes" und tiks/labels basierend auf Werten enthalten, die für das Ranking verwendet wurden. Ich habe versucht, mpl.colarbar.ColorbarBase() von Matplotlib, aber es scheint nicht Seabahnen sns.cubehelix_palette() zu mögen. Ich frage mich, wie man diese beiden Dinge zusammenbringt oder einfachere Lösungen?Colorbar für Barplot, wenn Bar-Farben nach Rängen ausgewählt werden

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 
sns.set_style("white") 
#%matplotlib inline 

index = ['25', '26', '27'] 
count = [10, 50, 22] 
phase = [0.9, 2.2, 1.2] 
ranks = [0, 2, 1] 

rank_classes = {0:"Ph<1", 1:"1<Ph<1.2", 2:"Ph>=1.2"} 

d = {'count' : pd.Series(count, index=index), 
    'phase' : pd.Series(phase, index=index), 
    'rank' : pd.Series(ranks, index=index) 
    } 

df = pd.DataFrame(d) 

# barplot 
fig, ax = plt.subplots() 
pal = sns.cubehelix_palette(3) 

x = df.index 
y = list(df['count']) 
z = list(df['rank']) 

sns.barplot(x=x, y=y, palette=np.array(pal)[z]) 
sns.despine() 
+0

Wollen Sie dieses http://stackoverflow.com/questions/31313606/pyplot-matplotlib-bar-chart-with-fill-color-depending-on-value? – lanery

+0

@lanerry Ich sehe, der Trick besteht darin, zwei Figuren übereinander zu zeichnen und vom Scatter-Plot nur colorbar anzuzeigen. In meinem Fall habe ich zwei Probleme mit der Anpassung von Code für meine Bedürfnisse. Zuerst möchte ich seaborn Farbschema mit vordefinierten Anzahl von Farben wie ** sns.cubehelix_palette (3) ** verwenden. Aber dieses Format ist nicht kompatibel mit cmap in plt.scatter(). Wie man es kompatibel macht? Zweitens, Wie vordefinierte Zeichenfolge Etiketten ("A", "B", "Z") für erste, zweite, etc ... Farben in ** sns.cubehelix_palette (3) ** mit ** plt.colobar zuweisen() **? – tonu

Antwort

1

Fast dort

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import seaborn as sns 
sns.set_style("white") 
%matplotlib inline 

index = ['25', '26', '27'] 
count = [10, 50, 22] 
phase = [0.9, 2.2, 1.2] 
rank = [0, 2, 1] 
# 
rank_classes = {0:"Ph<1", 1:"1<Ph<1.2", 2:"Ph>=1.2"} 

pal = sns.cubehelix_palette(len(index)) 
cmp = mpl.colors.LinearSegmentedColormap.from_list('my_list', pal,\ 
                N=len(index)) 
plot = plt.scatter(index, count, c=range(len(index)), cmap=cmp) 
plt.clf() 
plt.colorbar(plot) 
sns.barplot(x=index, y=count, palette=np.array(pal)[rank]) 
sns.despine() 

Produziert schönes Grundstück mit colorbar. Ich muss nur herausfinden, wie man die Nummernschilder der Farbbalken (0, 0.3 ... 3.0) durch Zeichenfolgen ersetzt, die im Wörterbuch rank_classes aufgelistet sind.

Bar plot with colobar

+0

Endlich geschafft zu bekommen, was ich benötigt basierend auf: http://stackoverflow.com/questions/3831569/matplotlib-pyclot-colorbar-question und http://stackoverflow.com/questions/15908371/matplotlib-colorbars- und-es-Text-Etiketten – tonu

Verwandte Themen