2015-11-05 72 views
6

我想創建一個boxLot的列表,其框的顏色取決於我用作輸入的pandas.DataFrame列的名稱。基於DataFrame列的顏色seaborn boxplot列名

列名稱包含指示實驗條件的字符串,根據該實驗條件我想將boxplot的框着色。

我這樣做是爲了使箱線圖:

sns.boxplot(data = data.dropna(), orient="h") 
plt.show() 

這將創建正確的名稱盒狀圖的一個美麗的列表。現在我想給每個boxplot,它的名字中有'prog +,DMSO +'的紅色,其餘的都是藍色。

我試圖創建與列名作爲關鍵字和顏色的字典作爲值:

color = {} 
for column in data.columns: 
    if 'prog+, DMSO+' in column: 
     color[column] = 'red' 
    else: 
     color[column] = 'blue' 

,然後使用字典作爲顏色:

sns.boxplot(data = data.dropna(), orient="h", color=color[column]) 
plt.show() 

這是不行的,可以理解的(有沒有循環通過字典)。所以我做一個循環:

for column in data.columns: 
    sns.boxplot(data = data[column], orient='h', color=color[column]) 
plt.show() 

這確實讓不同顏色的箱線圖,但都在彼此的頂部,並沒有正確的標籤。如果我能以某種方式將這些盒狀圖很好地放置在一個點下方,我幾乎可以達到我想要的狀態。或者,還有更好的方法?

+0

你要通過你的字典'palette'(多種顏色),而不是'color'(單一個)。 – mwaskom

回答

8

您應該使用palette參數,它處理多種顏色,而不是color,它處理特定的顏色。您可以給palette一個名稱,一個有序列表或一本字典。後者似乎最適合你的問題:

import seaborn as sns 
sns.set_color_codes() 
tips = sns.load_dataset("tips") 
pal = {day: "r" if day == "Sat" else "b" for day in tips.day.unique()} 
sns.boxplot(x="day", y="total_bill", data=tips, palette=pal) 

enter image description here

+0

謝謝,這完美地工作。我非常接近,我已經嘗試過調色板,但從來沒有像一個字典一樣認爲我必須以某種方式循環輸入條目。 – Freek

7

可以一氣呵成繪製所有這些設置後的各個框的facecolor,使用ax.artists[i].set_facecolor('r')

例如:

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

df = pd.DataFrame(
     [[2, 4, 5, 6, 1], 
     [4, 5, 6, 7, 2], 
     [5, 4, 5, 5, 1], 
     [10, 4, 7, 8, 2], 
     [9, 3, 4, 6, 2], 
     [3, 3, 4, 4, 1] 
     ],columns=['bar', 'prog +, DMSO+ 1', 'foo', 'something', 'prog +, DMSO+ 2']) 

ax = sns.boxplot(data=df,orient='h') 

boxes = ax.artists 

for i,box in enumerate(boxes): 
    if 'prog +, DMSO+' in df.columns[i]: 
     box.set_facecolor('r') 
    else: 
     box.set_facecolor('b') 

plt.tight_layout() 
plt.show() 

enter image description here

+0

這是一個聰明的解決方案,但不必要的複雜。 – mwaskom

+0

(+1)這是迄今爲止我發現的唯一方法,可以用seaborn處理分組箱形圖中的各種顏色。 – MaxG