pyplotで円を描く


158

驚いたことに、matplotlib.pyplot(pylabは使用しないでください)を入力の中心(x、y)と半径rとして円を描く方法について、わかりやすい説明が見つかりませんでした。私はこれのいくつかの変種を試しました:

import matplotlib.pyplot as plt
circle=plt.Circle((0,0),2)
# here must be something like circle.plot() or not?
plt.show()

...しかし、まだ機能していません。


これは可能だと確信していますが、matplotlibは主にプロットすることを目的としています(つまり、ここにいくつかのデータがあり、それらをグラフに表示します)。
トーマスK

散布図の半径は、データを視覚化するためにますます使用されています。Googleチャートでは、「バブルプロット」と呼んでいます。Gapminder.orgは良い例です。これ描画であり、描画ではありません。matplotlib github repoで "bubble"と "scatter radius"を検索しましたが、役に立たなかったので、機能を追加する限り、これはto-doリストにはないと思います。
Bennett Brown

1
plt.scatter()はサイズ引数を取ります。円のx座標とy座標、円の半径、円の色のリストを渡すことができます。matplotlib.org/1.3.1/api/…。以前の私のエラーは、そのような機能はまだmatplotlibにはないということです。
ベネットブラウン

3
ただ言及する:にplt.Circle(..)指示しmatplotlib.patches.Circle()ます。したがって、pyplotなしのソリューションは次のようになりますcircle = matplotlib.patches.Circle(..); axes.add_artist(circle)
ImportanceOfBeingErnest

回答:


203

それをAxesに追加する必要があります。A CircleはのサブクラスでArtistあり、axesにはadd_artistメソッドがあります。

これを行う例を次に示します。

import matplotlib.pyplot as plt

circle1 = plt.Circle((0, 0), 0.2, color='r')
circle2 = plt.Circle((0.5, 0.5), 0.2, color='blue')
circle3 = plt.Circle((1, 1), 0.2, color='g', clip_on=False)

fig, ax = plt.subplots() # note we must use plt.subplots, not plt.subplot
# (or if you have an existing figure)
# fig = plt.gcf()
# ax = fig.gca()

ax.add_artist(circle1)
ax.add_artist(circle2)
ax.add_artist(circle3)

fig.savefig('plotcircles.png')

これにより、次の図が得られます。

最初の円は原点にありますclip_onTrue、デフォルトではなので、円はを超えたときにクリップされaxesます。3番目の(緑の)円は、をクリップしないとどうなるかを示していますArtist。軸を超えて拡張されます(ただし、図を超えません。つまり、すべてのアーティストをプロットするために図のサイズが自動的に調整されません)。

x、y、および半径の単位は、デフォルトではデータ単位に対応しています。この場合、軸には何もプロットしませんでした(fig.gca()現在の軸を返します)。制限が設定されていないため、デフォルトではxとyの範囲は0〜1です。

以下は、ユニットの重要性を示す例の続きです。

circle1 = plt.Circle((0, 0), 2, color='r')
# now make a circle with no fill, which is good for hi-lighting key results
circle2 = plt.Circle((5, 5), 0.5, color='b', fill=False)
circle3 = plt.Circle((10, 10), 2, color='g', clip_on=False)

ax = plt.gca()
ax.cla() # clear things for fresh plot

# change default range so that new circles will work
ax.set_xlim((0, 10))
ax.set_ylim((0, 10))
# some data
ax.plot(range(11), 'o', color='black')
# key data point that we are encircling
ax.plot((5), (5), 'o', color='y')

ax.add_artist(circle1)
ax.add_artist(circle2)
ax.add_artist(circle3)
fig.savefig('plotcircles2.png')

その結果:

2番目の円の塗りつぶしをどのように設定したかがわかりますFalse。これは、(黄色のデータポイントのように)重要な結果を囲むのに役立ちます。


4
あなたは陰謀ではなく円を「描いている」ので、私はこの答えが好きです。プロットは私の最初の本能だったでしょうが。
samb8s

7
参考:この回答が書かれてから、Circleクラスはmatplotlib.pyplotからmatplotlib.patchesに移動したようです。
pavon

6
しかし、しかし円は楕円形です!
rubenvb 2016

1
:私の他の回答を参照@rubenvb stackoverflow.com/questions/9230389/...
ヤン

3
@pavon私にとってはとmatplotlib.pyplot.Circle == matplotlib.patches.Circle評価されるTrueので、それらはおそらくエイリアスです。
Evgeni Sergeev

66
import matplotlib.pyplot as plt
circle1=plt.Circle((0,0),.2,color='r')
plt.gcf().gca().add_artist(circle1)

円を既存のプロットにすばやくプラグインするための、受け入れられた回答のクイック圧縮バージョン。承認された回答とその他の回答を参照して、詳細を理解してください。

ところで:

  • gcf() Get Current Figureを意味します
  • gca() 現在の軸を取得することを意味します

4
パーフェクト!ちょうど私が今見る必要があったものです。あなたの「さようなら」も非常に役に立ちました!dir(fig)30以上の「get」メソッドを示していgcaますが、get_current_axisエイリアスはありません。このようなフィの答えは素晴らしいです。
uhoh

6
plt.gca()代わりに実際に行うことができますplt.gcf().gca()
Andre Holzner 2017

38

一連の円をプロットする場合は、この投稿またはこの要点(少し新しい)を確認することをお勧めします。投稿はという関数を提供しましたcircles

関数circlesはのようscatterに機能しますが、プロットされた円のサイズはデータ単位です。

次に例を示します。

from pylab import *
figure(figsize=(8,8))
ax=subplot(aspect='equal')

#plot one circle (the biggest one on bottom-right)
circles(1, 0, 0.5, 'r', alpha=0.2, lw=5, edgecolor='b', transform=ax.transAxes)

#plot a set of circles (circles in diagonal)
a=arange(11)
out = circles(a, a, a*0.2, c=a, alpha=0.5, edgecolor='none')
colorbar(out)

xlim(0,10)
ylim(0,10)

ここに画像の説明を入力してください


何をしtransform=ax.transAxesますか?
リー

3
@Lee右下隅の円の場合、データを軸座標に変換します。つまり、(1,1)は軸の右上隅を意味し、(1,0)は右下隅を意味します。など
Syrtis Major

4
これはmatplotlibの一部である必要があります。
JustAC0der 2016年

で使用できますmplleafletか?もしそうなら、例を挙げていただけますか?
フランソワM.

@fmalaussenaこのコードスニペットは純粋なmatplotlibので、mplleaflet試したことはありませんが、互換性があるはずです。
シルティス少佐

21
#!/usr/bin/python
import matplotlib.pyplot as plt
import numpy as np

def xy(r,phi):
  return r*np.cos(phi), r*np.sin(phi)

fig = plt.figure()
ax = fig.add_subplot(111,aspect='equal')  

phis=np.arange(0,6.28,0.01)
r =1.
ax.plot( *xy(r,phis), c='r',ls='-' )
plt.show()

または、必要に応じてpathhttp://matplotlib.sourceforge.net/users/path_tutorial.htmlを参照してください。


2
円の三角方程式と退行0 tp 360、これは0〜6.28319ラジアンに変換mathopenref.com/coordparamcircle.html
Alex Punnen 2015年


11

受け入れられた回答を一般的なユースケースに拡張します。特に:

  1. 自然なアスペクト比で円を表示します。

  2. 新しくプロットされた円を含むように軸の範囲を自動的に拡張します。

自己完結型の例:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.add_patch(plt.Circle((0, 0), 0.2, color='r', alpha=0.5))
ax.add_patch(plt.Circle((1, 1), 0.5, color='#00ffff', alpha=0.5))
ax.add_artist(plt.Circle((1, 0), 0.5, color='#000033', alpha=0.5))

#Use adjustable='box-forced' to make the plot area square-shaped as well.
ax.set_aspect('equal', adjustable='datalim')
ax.plot()   #Causes an autoscale update.
plt.show()

違いに注意してくださいax.add_patch(..)ax.add_artist(..)::2の、機械を自動スケーリング前者のみになり、アカウント(参照に円を取るの議論ので、上記のコードを実行した後に、私たちが得ます、):

add_patch(..)とadd_artist(..)

参照:set_aspect(..)ドキュメントを


python3では、を取り出す必要がありfig, ax = plt.subplots()ます。そうしないと、2つのウィンドウが表示されます(1つは空白です)。
albus_c 2018

1

(.circle)を使用してプロットを表示しますが、実行したいことに基づいて、これを試すこともできます。

import matplotlib.pyplot as plt
import numpy as np

x = list(range(1,6))
y = list(range(10, 20, 2))

print(x, y)

for i, data in enumerate(zip(x,y)):
    j, k = data
    plt.scatter(j,k, marker = "o", s = ((i+1)**4)*50, alpha = 0.3)

線形進行点を使用した単純な同心円プロット

centers = np.array([[5,18], [3,14], [7,6]])
m, n = make_blobs(n_samples=20, centers=[[5,18], [3,14], [7,6]], n_features=2, 
cluster_std = 0.4)
colors = ['g', 'b', 'r', 'm']

plt.figure(num=None, figsize=(7,6), facecolor='w', edgecolor='k')
plt.scatter(m[:,0], m[:,1])

for i in range(len(centers)):

    plt.scatter(centers[i,0], centers[i,1], color = colors[i], marker = 'o', s = 13000, alpha = 0.2)
    plt.scatter(centers[i,0], centers[i,1], color = 'k', marker = 'x', s = 50)

plt.savefig('plot.png')

分類問題の丸で囲まれた点。


0

こんにちは私は円を描くためのコードを書きました。あらゆる種類の円を描くのに役立ちます。 画像は、半径1、中心が0,0円を示しています。中心と半径は任意に編集できます。

## Draw a circle with center and radius defined
## Also enable the coordinate axes
import matplotlib.pyplot as plt
import numpy as np
# Define limits of coordinate system
x1 = -1.5
x2 = 1.5
y1 = -1.5
y2 = 1.5

circle1 = plt.Circle((0,0),1, color = 'k', fill = False, clip_on = False)
fig, ax = plt.subplots()
ax.add_artist(circle1)
plt.axis("equal")
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
plt.xlim(left=x1)
plt.xlim(right=x2)
plt.ylim(bottom=y1)
plt.ylim(top=y2)
plt.axhline(linewidth=2, color='k')
plt.axvline(linewidth=2, color='k')

##plt.grid(True)
plt.grid(color='k', linestyle='-.', linewidth=0.5)
plt.show()

幸運を


0

散布図と同様に、円線スタイルの通常のプロットも使用できます。markersizeパラメータを使用して、円の半径を調整できます。

import matplotlib.pyplot as plt

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