web-dev-qa-db-ja.com

Seaborn Jointplotを使用して各ポイントの色とマーカーを変更する

このコードを here から少し変更しました:

_import seaborn as sns
sns.set(style="darkgrid")

tips = sns.load_dataset("tips")
color = sns.color_palette()[5]
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", stat_func=None,
                  xlim=(0, 60), ylim=(0, 12), color='k', size=7)

g.set_axis_labels('total bill', 'tip', fontsize=16)
_

見栄えの良いプロットが表示されます。ただし、私の場合は、個々のポイントの色と形式を変更できる必要があります。

キーワードmarkerstylefmtを使用してみましたが、エラーTypeError: jointplot() got an unexpected keyword argumentが発生します。

これを行う正しい方法は何ですか? _sns.JointGrid_を呼び出してデータと限界分布を手動でプロットすることは避けたいです。

16
pbreach

この問題を解決することは、周辺分布を維持したかったことを除いて、matplotlib(異なるマーカーと色で散布図をプロットすること)とほとんど同じです。

import seaborn as sns
from itertools import product
sns.set(style="darkgrid")

tips = sns.load_dataset("tips")
color = sns.color_palette()[5]
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", stat_func=None,
                  xlim=(0, 60), ylim=(0, 12), color='k', size=7)

#Clear the axes containing the scatter plot
g.ax_joint.cla()

#Generate some colors and markers
colors = np.random.random((len(tips),3))
markers = ['x','o','v','^','<']*100

#Plot each individual point separately
for i,row in enumerate(tips.values):
    g.ax_joint.plot(row[0], row[1], color=colors[i], marker=markers[i])

g.set_axis_labels('total bill', 'tip', fontsize=16)

これは私にこれを与えます:

enter image description here

これで回帰直線はなくなりましたが、これで十分です。

21
pbreach

受け入れられた答えは複雑すぎます。 plt.sca()を使用すると、これをより簡単な方法で行うことができます。

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", stat_func=None,
                  xlim=(0, 60), ylim=(0, 12))


g.ax_joint.cla() # or g.ax_joint.collections[0].set_visible(False), as per mwaskom's comment

# set the current axis to be the joint plot's axis
plt.sca(g.ax_joint)

# plt.scatter takes a 'c' keyword for color
# you can also pass an array of floats and use the 'cmap' keyword to
# convert them into a colormap
plt.scatter(tips.total_bill, tips.tip, c=np.random.random((len(tips), 3)))
15
Max Shron

キーワードjoint_kws(seaborn 0.8.1でテスト済み)のおかげで、引数のリストで直接正確にすることもできます。必要に応じて、marginal_kwsを使用してマージナルのプロパティを変更することもできます

したがって、コードは次のようになります。

import seaborn as sns
colors = np.random.random((len(tips),3))
markers = (['x','o','v','^','<']*100)[:len(tips)]

sns.jointplot("total_bill", "tip", data=tips, kind="reg",
    joint_kws={"color":colors, "marker":markers})
3
  1. _seaborn/categorical.py_で_def swarmplot_を見つけます。
  2. _marker='o'_の前にパラメータ_**kwargs_を追加します
  3. _kwargs.update_に_marker=marker_を追加します。

次に、たとえばMatplotlib sns.swarmplot()の場合と同様に、plt.scatter()を使用してプロットするときに、パラメータとして_marker='x'_を使用します。

ちょうど同じ必要性に遭遇し、markerkwargとして使用しても機能しませんでした。だから私は簡単に見ていた。他のパラメーターも同様の方法で設定できます。 https://github.com/ccneko/seaborn/blob/master/seaborn/categorical.py

ここで必要なのはわずかな変更だけですが、クイックリファレンス用のGitHub forkページがあります;)

1
Claire

もう1つのオプションは、jointGridを使用することです。これは、jointplotがその使用を簡単にするラッパーであるためです。

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")

g = sns.JointGrid("total_bill", "tip", data=tips)
g = g.plot_joint(plt.scatter, c=np.random.random((len(tips), 3)))
g = g.plot_marginals(sns.distplot, kde=True, color="k")
0
Vlamir