web-dev-qa-db-ja.com

シーボーンと同じスタイルだが異なる色相でポイントマーカーとラインをプロットする

以下のデータフレームを考えます:

import pandas as pd
df = pd.DataFrame({
    "n_index": list(range(5)) * 2,
    "logic": [True] * 5 + [False] * 5,
    "value": list(range(5)) + list(range(5, 10))
})

colorとcolorのみを使用して、ラインプロットでlogicを区別し、valuesのポイントをマークしたいです。具体的には、これは私の希望する出力です(R ggplot2 でプロット):

ggplot(aes(x = n_index, y = value, color = logic), data = df) + geom_line() + geom_point()

desired output

seaborn.lineplot で同じことをしようとしましたが、markers=Trueを指定しましたが、マーカーはありませんでした。

import seaborn as sns
sns.set()
sns.lineplot(x="n_index", y="value", hue="logic", markers=True, data=df)

sns no markers

次に、style="logic"をコードに追加してみましたが、マーカーが表示されました。

sns.lineplot(x="n_index", y="value", hue="logic", style="logic", markers=True, data=df)

sns with markers 1

また、マーカーを強制的に同じスタイルにしようとしました:

sns.lineplot(x="n_index", y="value", hue="logic", style="logic", markers=["o", "o"], data=df)

sns with markers 2

マーカーを持つ前にstyleを指定する必要があるようです。ただし、1つのデータ次元で2つの美的な次元を使用したくないので、それは望ましくないプロット出力を引き起こします。それは美的マッピングの原則に違反しています。

seabornまたはPython visualization?(seabornが推奨されます-ループ方法of matplotlibが好きではありません。)

8
ytu

プロットにpandasを直接使用できます。

groupby経由のパンダ

fig, ax = plt.subplots()
df.groupby("logic").plot(x="n_index", y="value", marker="o", ax=ax)
ax.legend(["False","True"])

enter image description here

ここでの欠点は、凡例を手動で作成する必要があることです。

ピボット経由のパンダ

df.pivot_table("value", "n_index", "logic").plot(marker="o")

enter image description here

seaborn lineplot

シーボーンラインプロットの場合、目的の結果を得るには1つのマーカーで十分です。

sns.lineplot(x="n_index", y="value", hue="logic", data=df, marker="o")

enter image description here

dashesパラメーターをFalseに設定する必要があります。また、グリッドのスタイルを"darkgrid"に指定する必要があります。

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

df = pd.DataFrame({
    "n_index": list(range(5)) * 2,
    "logic": [True] * 5 + [False] * 5,
    "value": list(range(5)) + list(range(5, 10))
})

sns.set_style("darkgrid")
sns.lineplot(x="n_index", dashes=False, y="value", hue="logic", style="logic", markers=["o", "o"], data=df)
plt.show()

enter image description here

1
Daniel Mesejo