2015-11-05 17 views
6

入力として使用するpandas.DataFrame列の名前に応じてボックスの色でboxplotsのリストを作成したいと思います。DataFrameの列名に基づく色のついたボックスプランPlot

列名には、ボックスプロットのボックスを色付けするための実験条件を示す文字列が含まれています。

私は箱ひげ図を作成するために、この操作を行います。

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

これが正しい名前と箱ひげ図の美しいリストを作成します。今度は、名前に「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() 

:だから私はループを作ります。どういうわけか、私は何とかこれらのボックスプロットを互いの下の1つのプロットにきれいに置くことができれば、私はほとんど私が望むところにいるだろう。それとも良い方法がありますか?

+0

あなたは 'palette'(複数の色)ではなく' color'(シングル1)に辞書を渡す必要があります。 – 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

あなたが例えばax.artists[i].set_facecolor('r')

を使用して、一度にそれらすべてをプロットした後、個々の箱のFaceColorとを設定することができます。

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)これは、これまで私がシーボーンのグループボックスプロットの個々の色を扱うために見つけた唯一の方法です – MaxG

関連する問題