HOWTO · Seaborn
Seaborn 複数の折れ線グラフ
幅広形式またはロング形式のデータから、Seaborn の複数の線を作成してカスタマイズします。
このページの内容
Seabornで複数の線を描くには、各系列をpandasのDataFrameの列に入れ、そのDataFrameをlineplot()に渡します。縦長形式のデータでは、値の列と系列を示す列をそれぞれyとhueに割り当てます。線の見た目やプロット内の文字サイズも調整できます。
幅広形式のデータから複数の線を描く
5つの測定系列を描くには、各系列を別々のDataFrame列に入れて、そのDataFrameをlineplot()に渡します。インデックスがx値になり、各列がそれぞれ別の線になります。次の例では、DataFrameの作成からプロットまでを行います。変更されていない例の軸ラベルとタイトルは英語のままで、「Index」「Value」「Five series」などと表示されます。
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
values = {
"A": [11, 3, 0, 0, 0, 0],
"B": [1, 8, 16, 0, 0, 1],
"C": [0, 0, 3, 12, 0, 0],
"D": [2, 1, 0, 0, 13, 0],
"E": [0, 0, 0, 0, 0, 16],
}
data = pd.DataFrame(values, index=range(6))
ax = sns.lineplot(data=data)
ax.set(xlabel="Index", ylabel="Value", title="Five series")
plt.tight_layout()
plt.show()
提示された実行では、この例は標準出力なしで正常に完了し、終了コードは0でした。手元で実行するには、Python環境にpandas、Seaborn、Matplotlibをインストールしてください。値がすでにNumPy配列になっている場合は、その配列をpd.DataFrame()に渡せます。値から配列を作成するNumPyのコンストラクターはnumpy.array()です。
縦長形式のデータから複数の系列を描く
縦長形式のデータでは、1行に1つの観測値を格納し、x値、系列の識別情報、測定値をそれぞれ列にします。それらの列名をx、hue、yとして渡します。Seabornはxを水平方向の位置、yを垂直方向の値に使い、hueに基づいて系列ごとに別の線を描きます。
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
long_data = pd.DataFrame(
[
(0, "A", 11), (1, "A", 3), (2, "A", 0),
(0, "B", 1), (1, "B", 8), (2, "B", 16),
(0, "C", 0), (1, "C", 0), (2, "C", 3),
],
columns=["x", "series", "value"],
)
ax = sns.lineplot(data=long_data, x="x", y="value", hue="series")
ax.set(title="Three series", ylabel="Value")
plt.tight_layout()
plt.show()
提示された実行では、2つ目の例も標準出力なしで正常に完了し、終了コードは0でした。各系列がすでに別々の列にある場合は幅広形式を使い、各行が系列と1つの観測値を表す場合は縦長形式を使います。どちらの形式でも、プロットした値を読み取れるよう、軸に内容の分かるラベルを付けてください。
線とマーカーの見た目を調整する
縦長形式のデータでは、hueで系列を分け、パレットで系列ごとの色を割り当てます。lineplot()でmarkers=Trueとstyle="series"を指定すると、系列ごとに異なる形のマーカーを表示できます。同じ記号をすべての系列で使う場合は、マーカーを個別に選ぶ方法もあります。線が別の場所ですでに識別されているならlegend=Falseで凡例を非表示にできます。色やマーカーの対応を示す必要がある場合は、凡例を残すと役立ちます。
線の見た目を直接調整するには、プロットから返される線オブジェクトのスタイルを設定します。系列の割り当てとパレットの選択はSeabornに任せながら、マーカーのサイズや縁取りはMatplotlibの線プロパティで調整できます。
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
long_data = pd.DataFrame(
[(x, series, value) for series, values in {
"A": [11, 3, 0], "B": [1, 8, 16], "C": [0, 0, 3]
}.items() for x, value in enumerate(values)],
columns=["x", "series", "value"],
)
ax = sns.lineplot(
data=long_data,
x="x",
y="value",
hue="series",
palette="dark",
legend=False,
)
for line in ax.lines:
line.set_linewidth(2)
line.set_marker("o")
line.set_markersize(7)
line.set_markerfacecolor("white")
line.set_markeredgecolor("red")
line.set_markeredgewidth(1.5)
ax.set(title="Styled series", ylabel="Value")
plt.tight_layout()
plt.show()
提示された実行では、このスタイル調整の例は標準出力なしで正常に完了し、終了コードは0でした。線幅は線の太さ、マーカーサイズは記号の大きさを決めます。マーカーの塗りつぶし色と縁の色を変えると、記号と線を区別でき、縁の幅で輪郭の太さを調整できます。図に合わせてマーカーの形やパレットを変えてください。系列を見分けるために必要な場合は、凡例を残します。
プロット内の文字サイズを調整する
プロットを作成する前にSeabornのフォントスケールを設定すると、プロット内の文字を拡大または縮小できます。1より大きい値では既定より文字が大きくなり、1より小さい値では小さくなります。この設定は、ラベルや目盛りの文字など、プロット内のテキスト要素に適用されます。
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set(font_scale=1.3)
data = pd.DataFrame({"A": [2, 4, 3], "B": [1, 3, 5]})
ax = sns.lineplot(data=data, markers=True)
ax.set(title="Scaled plot text", xlabel="Index", ylabel="Value")
plt.tight_layout()
plt.show()
提示された実行では、最後の例も標準出力なしで正常に完了し、終了コードは0でした。font_scaleを調整して、図とラベルが利用可能なスペースに収まるようにしてください。