plot een cirkel met pyplot

verrassend genoeg vond ik geen duidelijke beschrijving over het tekenen van een cirkel met matplotlib.pyplot (gelieve geen pylab) als invoercentrum (x,y) en straal r. Ik heb enkele varianten hiervan geprobeerd:

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

… maar kreeg het nog steeds niet werkend.


Antwoord 1, autoriteit 100%

Je moet het toevoegen aan een assen. Een Circleis een subklasse van een Patch, en een axesheeft een add_patchmethode. (Je kunt ook add_artistgebruiken maar het wordt niet aanbevolen.)

Hier is een voorbeeld om dit te doen:

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_patch(circle1)
ax.add_patch(circle2)
ax.add_patch(circle3)
fig.savefig('plotcircles.png')

Dit resulteert in het volgende cijfer:

De eerste cirkel bevindt zich in de oorsprong, maar standaard is clip_onTrue, dus de cirkel wordt afgekapt wanneer deze buiten de axes. De derde (groene) cirkel laat zien wat er gebeurt als je de Artistniet knipt. Het reikt verder dan de assen (maar niet voorbij de figuur, dwz de figuurgrootte wordt nietautomatisch aangepast om al je artiesten te plotten).

De eenheden voor x, y en straal komen standaard overeen met gegevenseenheden. In dit geval heb ik niets op mijn assen geplot (fig.gca()geeft de huidige assen terug), en aangezien de limieten nooit zijn ingesteld, worden ze standaard ingesteld op een x- en y-bereik van 0 tot 1.

Hier is een vervolg op het voorbeeld, dat laat zien hoe eenheden ertoe doen:

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_patch(circle1)
ax.add_patch(circle2)
ax.add_patch(circle3)
fig.savefig('plotcircles2.png')

wat resulteert in:

Je kunt zien hoe ik de vulling van de 2e cirkel heb ingesteld op False, wat handig is voor het omcirkelen van belangrijke resultaten (zoals mijn gele gegevenspunt).


Antwoord 2, autoriteit 34%

import matplotlib.pyplot as plt
circle1 = plt.Circle((0, 0), 0.2, color='r')
plt.gca().add_patch(circle1)

Een snelle verkorte versie van het geaccepteerde antwoord, om snel een cirkel in een bestaand plot te pluggen. Raadpleeg het geaccepteerde antwoord en andere antwoorden om de details te begrijpen.

Trouwens:

  • gca()betekent Get Current Axis

Antwoord 3, autoriteit 15%

Als je een reeks kringen wilt plotten, kun je dit berichtof deze kern(een beetje nieuwer). Het bericht bood een functie met de naam circles.

De functie circleswerkt als scatter, maar de afmetingen van geplotte cirkels zijn in data-eenheid.

Hier is een voorbeeld:

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)

voer hier de afbeeldingsbeschrijving in


Antwoord 4, autoriteit 9%

#!/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()

Of, als je wilt, kijk naar de paths, http ://matplotlib.sourceforge.net/users/path_tutorial.html


Antwoord 5, autoriteit 8%

Als u wilt dat de “cirkel” een visuele aspectverhouding van 1 behoudt, ongeacht de gegevenscoördinaten, kunt u de scatter()-methode gebruiken. http://matplotlib.org/1.3.1/api/pyplot_api .html#matplotlib.pyplot.scatter

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 20, 30, 40, 50]
r = [100, 80, 60, 40, 20] # in points, not data units
fig, ax = plt.subplots(1, 1)
ax.scatter(x, y, s=r)
fig.show()

Afbeelding is een spreidingsplot. Vijf cirkels langs de lijn y=10x hebben afnemende stralen van linksonder naar rechtsboven . Hoewel de grafiek vierkant is, heeft de y-as 10 keer het bereik van de x-as. Toch is de hoogte-breedteverhouding van de cirkels 1 op het scherm.


Antwoord 6, autoriteit 5%

Het geaccepteerde antwoord uitbreiden voor een algemeen gebruik. In het bijzonder:

  1. Bekijk de cirkels met een natuurlijke beeldverhouding.

  2. Verleng automatisch de aslimieten om de nieuw geplotte cirkels op te nemen.

Op zichzelf staand voorbeeld:

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()

Let op het verschil tussen ax.add_patch(..)en ax.add_artist(..): van de twee zorgt alleen de eerste ervoor dat autoscaling-machines rekening houden met de cirkel (referentie: discussie), dus na het uitvoeren van de bovenstaande code krijgen we:

add_patch(..) vs add_artist(..)

Zie ook: set_aspect(..)documentatie.


Antwoord 7, autoriteit 3%

Ik zie plots met het gebruik van (.circle), maar op basis van wat je zou willen doen, kun je dit ook uitproberen:

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)

Eenvoudige concentrische cirkelgrafiek met lineaire voortschrijdende punten

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')

Omcirkelde punten van een classificatieprobleem.


Antwoord 8

Net als bij een spreidingsplot kunt u ook een normale plot gebruiken met een cirkellijnstijl. Met de parameter markersizekunt u de straal van een cirkel aanpassen:

import matplotlib.pyplot as plt
plt.plot(200, 2, 'o', markersize=7)

Antwoord 9

Hallo, ik heb een code geschreven voor het tekenen van een cirkel.
Het zal helpen bij het tekenen van allerlei soorten cirkels.
De afbeelding toont de cirkel met straal 1 en middelpunt op 0,0
Het middelpunt en de straal kunnen naar keuze worden bewerkt.

## 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()

Veel succes

Other episodes