Pythonで空の円を使って散布図を作成するにはどうすればよいですか?


166

Pythonでは、Matplotlibを使用して、空の円を含む散布図をどのようにプロットできますか?目標は、理想的には色付きの円を再描画することなく、それらを強調表示するために、によってすでにプロットされている色付き円盤の一部の周りに空の円を描くscatter()ことです。

試しましたがfacecolors=None、役に立ちませんでした。


1
異なる色で空/中空の散布図を描きたい人は、この質問を見るかもしれません。
ImportanceOfBeingErnest

回答:


242

scatter のドキュメントから:

Optional kwargs control the Collection properties; in particular:

    edgecolors:
        The string none to plot faces with no outlines
    facecolors:
        The string none to plot unfilled outlines

以下を試してください:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.random.randn(60) 
y = np.random.randn(60)

plt.scatter(x, y, s=80, facecolors='none', edgecolors='r')
plt.show()

サンプル画像

注:他のタイプのプロットについては、およびの使用に関するこの投稿を参照してください。markeredgecolormarkerfacecolor


4
ありがとう!落とし穴は、より一般的な(Pythonでは)facecolors=None機能しないことです。
Eric O Lebigot、2015年

24
非常に役立ちます。それmarkerfacecolor='none'は、これが今のやり方です。
hesham_EE 2015年

2
エッジの幅をゼロに設定する方法でmatplotlibスタイルを使用しました。markerfacecolor='none'追加しようとしてマーカーが表示されない場合markeredgewidth=1.0
oLas

このアプローチは、Matplotlib %matplotlib inlineとの標準インポートを実行した後、Seabornで使用することもできます。import matplotlib.pyplot as plt次に、Seabornをプロットのデフォルトに設定しますimport seaborn as sns; sns.set()
Jakob

68

これらはうまくいくでしょうか?

plt.scatter(np.random.randn(100), np.random.randn(100), facecolors='none')

サンプル画像

またはplot()を使用

plt.plot(np.random.randn(100), np.random.randn(100), 'o', mfc='none')

サンプル画像


3
これは、次のplot代わりに使用する場合に役立ちますscatter
Trevor Boyd Smith

2
の場合scatteredgecolorslike を指定する必要がありますedgecolors='r'。それ以外の場合、円は消えます。こちらをご覧ください
T_T

14

これが別の方法です。これにより、現在のAxes、プロットまたはイメージなどに円が追加されます。

from matplotlib.patches import Circle  # $matplotlib/patches.py

def circle( xy, radius, color="lightsteelblue", facecolor="none", alpha=1, ax=None ):
    """ add a circle to ax= or current axes
    """
        # from .../pylab_examples/ellipse_demo.py
    e = Circle( xy=xy, radius=radius )
    if ax is None:
        ax = pl.gca()  # ax = subplot( 1,1,1 )
    ax.add_artist(e)
    e.set_clip_box(ax.bbox)
    e.set_edgecolor( color )
    e.set_facecolor( facecolor )  # "none" not None
    e.set_alpha( alpha )

代替テキスト

(図の円は楕円に押しつぶされimshow aspect="auto"ます)。


5

matplotlib 2.0にはと呼ばれるパラメーターがあり、fillstyle マーカーを塗りつぶす方法をより適切に制御できます。私の場合、エラーバーで使用しましたが、一般的にマーカーで機能します http://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.errorbar.html

fillstyle次の値を受け入れます。「左」| 「正しい」| 'ボトム' | 'トップ' | 'なし']

を使用する場合は、2つの重要な点に注意してくださいfillstyle

1)mfcが任意の種類の値に設定されている場合、それが優先されます。したがって、fillstyleを 'none'に設定した場合、効果はありません。したがって、mfcをfillstyleと組み合わせて使用​​しないでください。

2)マーカーのエッジ幅を制御したい場合があります(markeredgewidthまたはを使用mew)。マーカーが比較的小さく、エッジ幅が厚い場合、マーカーは塗りつぶされていないように見えます。

以下はエラーバーの使用例です。

myplot.errorbar(x=myXval, y=myYval, yerr=myYerrVal, fmt='o', fillstyle='none', ecolor='blue',  mec='blue')

2

Gary Kerrの例に基づいて、ここで提案されているように、次のコードで指定された値に関連する空の円を作成できます。

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.markers import MarkerStyle

x = np.random.randn(60) 
y = np.random.randn(60)
z = np.random.randn(60)

g=plt.scatter(x, y, s=80, c=z)
g.set_facecolor('none')
plt.colorbar()
plt.show()

これは本質的にcomplexifiedバージョン受け入れ答えです...
エリック・O Lebigot

私の点からはそうではありません。色で散布図を使用しても、コマンド内でfacecolor = "none"が除外されません。そのため、所定のリンクで説明されているように、その後のfacecolorの削除が必要です。残念ながら、この複雑なソリューションは、カラーコーディングを使用して散布図の面の色を削除するために必要です。
Aroc

この回答のアプローチは、もともと空の円が含まれていないグラフを更新したい場合に確かに役立ちます。ただし、これらの円を直接作成することに関する質問なので、最初のグラフの無関係な更新を行わずに、この回答と同じように直接行うので、受け入れられた解決策が進むべき道です。
Eric O Lebigot

この「複雑なバージョン」は、内部に引数を埋め込むこと.scatter()ができなかったときに私にとってはうまくいきました。コンテキストとして、カラーマップ(c=z, cmap='jet')も適用しました。
アンドリューシルバー

1

したがって、特定の基準に一致するいくつかのポイントを強調表示したいと思います。Preludeのコマンドを使用して、ハイライトされた点の2番目の散布図を空の円で作成し、最初の呼び出しですべての点をプロットできます。大きい空の円が小さい塗りつぶされた円を囲むために、sパラメータが十分に小さいことを確認してください。

もう1つのオプションは、スキャッターを使用せず、円/楕円コマンドを使用してパッチを個別に描画することです。これらはmatplotlib.patchesにあります。ここでは、円の長方形などを描画する方法のサンプルコードをいくつか示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.