irritable_phd_syndrome
irritable_phd_syndrome

Reputation: 5067

Why is matplotlib.patches.Circle not a circle?

I am trying to plot a circle over a plot. Using the Anatomy of a Figure for inspiration, I've created a short test code :

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.patches import Circle
from matplotlib.patheffects import withStroke

fig = plt.figure()
x = np.arange(1,10,.1)
y3 = np.sin(x)
gs = fig.add_gridspec(1,1)  # 2x2 grid
ax=fig.add_subplot(gs[0,0])
ax.plot(x,y3)
Xc = 6
Yc = 0.5
### This produces an ellipse
circle = Circle((Xc, Yc), 0.25, clip_on=False, zorder=10, linewidth=1,
                edgecolor='black', facecolor=(0, 0, 0, .0125),
                path_effects=[withStroke(linewidth=5, foreground='w')])
ax.add_artist(circle)
plt.show()

which generates the below plot plot

Question :

  1. Why is the displayed 'circle' really an ellipse?

The help page for Circle, defines a resolution order, but it isn't obvious how this 'resolution' order is decided. Given that my circle is following the format of the above Anatomy of a Figure, I don't understand how this happens.

Upvotes: 1

Views: 1625

Answers (1)

foglerit
foglerit

Reputation: 8269

For your circle to look like a circle, you have to set the aspect ratio of your plot to 1.

In your link, that is done in this line:

ax = fig.add_subplot(1, 1, 1, aspect=1)

In your example:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.patches import Circle
from matplotlib.patheffects import withStroke

fig = plt.figure()
x = np.arange(1,10,.1)
y3 = np.sin(x)
gs = fig.add_gridspec(1,1)  # 2x2 grid
ax=fig.add_subplot(gs[0,0], aspect=1)
ax.plot(x,y3)
Xc = 6
Yc = 0.5
### This produces an ellipse
circle = Circle((Xc, Yc), 0.25, clip_on=False, zorder=10, linewidth=1,
                edgecolor='black', facecolor=(0, 0, 0, .0125),
                path_effects=[withStroke(linewidth=5, foreground='w')])
ax.add_artist(circle)
plt.show()

enter image description here

Upvotes: 2

Related Questions