web-dev-qa-db-ja.com

Seaborn Tsplotで図の外に凡例を移動する

tsplotドキュメンテーションのこの例 のようにseaborn.tsplotを使用して時系列プロットを作成したいのですが、凡例を図の外側に移動しました。

example

seaborn's timeseries.py の339-340行に基づいて、seaborn.tsplotは現在、凡例の配置を直接制御できないように見えます。

    if legend:
        ax.legend(loc=0, title=legend_name)

Matplotlibの回避策はありますか? seaborn 0.6-devを使用しています。

34
bnelsj

実際、seabornはこれまでのところ凡例をうまく処理していません。 Matplotlib Legend Guide に従って、plt.legend()を使用して、matplotlibを介して凡例プロパティを直接制御できます。

例:

import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid")

# Load the long-form example gammas dataset
gammas = sns.load_dataset("gammas")

# Plot the response with standard error
sns.tsplot(data=gammas, time="timepoint", unit="subject",
           condition="ROI", value="BOLD signal")

# Put the legend out of the figure
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

Modified legend position

72

T = W。の答えをseaborn lineplotに適用しようとしましたが、成功しませんでした。彼の答えに対するいくつかの修正が仕事をしました...誰かが私がそうであったようにラインプロットバージョンを探しているなら!

import seaborn as sns
import pandas as pd

# load data
df = sns.load_dataset("gammas")

# EDIT: I Needed to ad the fig
fig, ax1 = plt.subplots(1,1)

# EDIT: 
# T.W.' answer said: "create with hue but without legend" <- # I needed to include it!
# So, removed: legend=False
g = sns.lineplot(x="timepoint", y="BOLD signal", hue="ROI", data=df, ax=ax1) 

# EDIT: 
# Removed 'ax' from T.W.'s answer here aswell:
box = g.get_position()
g.set_position([box.x0, box.y0, box.width * 0.85, box.height]) # resize position

# Put a legend to the right side
g.legend(loc='center right', bbox_to_anchor=(1.25, 0.5), ncol=1)

plt.show()

Seaborn Lineplot with Legend outside

6
pablo-az

セルゲイの答えは、seaborn.tsplotしかし、私はseaborn.lmplotだから私はもう少し深く見て、別の解決策を見つけました:

例:

import seaborn as sns
import pandas as pd

# load data
df = pd.DataFrame.from_csv('mydata.csv')

# create with hue but without legend
g = sns.lmplot(x="x_data", y="y_data", hue="condition", legend=False, data=df)

# resize figure box to -> put the legend out of the figure
box = g.ax.get_position() # get position of figure
g.ax.set_position([box.x0, box.y0, box.width * 0.85, box.height]) # resize position

# Put a legend to the right side
g.ax.legend(loc='center right', bbox_to_anchor=(1.25, 0.5), ncol=1)

sns.plt.show(g)

たぶん、あなたはそれらをあなたの伝説に合わせるために値をいじる必要があります。 これ 回答は、さらに例を必要とする場合にも役立ちます。

3
T.W.