Skip to content

Commit ca51e8d

Browse files
committed
Merge pull request #7072 from rougier/showcase
DOC: Replace anatomy of a plot figure
1 parent 80f5c8d commit ca51e8d

File tree

4 files changed

+140
-2
lines changed

4 files changed

+140
-2
lines changed

doc/faq/anatomy.png

101 KB
Loading

doc/faq/fig_map.png

-29 KB
Binary file not shown.

doc/faq/usage_faq.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ completely, leaving a purely object-oriented approach.
5050

5151
Parts of a Figure
5252
=================
53-
.. image:: fig_map.png
53+
.. image:: anatomy.png
5454

5555
:class:`~matplotlib.figure.Figure`
5656
----------------------------------
5757

58-
The **whole** figure (marked as the outer red box). The figure keeps
58+
The **whole** figure. The figure keeps
5959
track of all the child :class:`~matplotlib.axes.Axes`, a smattering of
6060
'special' artists (titles, figure legends, etc), and the **canvas**.
6161
(Don't worry too much about the canvas, it is crucial as it is the

examples/showcase/anatomy.py

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
# This figure shows the name of several matplotlib elements composing a figure
2+
3+
import numpy as np
4+
import matplotlib.pyplot as plt
5+
from matplotlib.ticker import MultipleLocator, FuncFormatter
6+
7+
np.random.seed(123)
8+
9+
X = np.linspace(0.5, 3.5, 100)
10+
Y1 = 3+np.cos(X)
11+
Y2 = 1+np.cos(1+X/0.75)/2
12+
Y3 = np.random.uniform(Y1, Y2, len(X))
13+
14+
fig = plt.figure(figsize=(8, 8), facecolor="w")
15+
ax = fig.add_subplot(1, 1, 1, aspect=1)
16+
17+
18+
def minor_tick(x, pos):
19+
if not x % 1.0:
20+
return ""
21+
return "%.2f" % x
22+
23+
ax.xaxis.set_major_locator(MultipleLocator(1.000))
24+
ax.xaxis.set_minor_locator(MultipleLocator(0.250))
25+
ax.yaxis.set_major_locator(MultipleLocator(1.000))
26+
ax.yaxis.set_minor_locator(MultipleLocator(0.250))
27+
ax.xaxis.set_minor_formatter(FuncFormatter(minor_tick))
28+
29+
ax.set_xlim(0, 4)
30+
ax.set_ylim(0, 4)
31+
32+
ax.tick_params(which='major', width=1.0)
33+
ax.tick_params(which='major', length=10)
34+
ax.tick_params(which='minor', width=1.0, labelsize=10)
35+
ax.tick_params(which='minor', length=5, labelsize=10, labelcolor='0.25')
36+
37+
ax.grid(linestyle="--", linewidth=0.5, color='.25', zorder=-10)
38+
39+
ax.plot(X, Y1, c=(0.25, 0.25, 1.00), lw=2, label="Blue signal", zorder=10)
40+
ax.plot(X, Y2, c=(1.00, 0.25, 0.25), lw=2, label="Red signal")
41+
ax.scatter(X, Y3, c='w')
42+
43+
ax.set_title("Anatomy of a figure", fontsize=20)
44+
ax.set_xlabel("X axis label")
45+
ax.set_ylabel("Y axis label")
46+
47+
ax.legend(frameon=False)
48+
49+
50+
def circle(x, y, radius=0.15):
51+
from matplotlib.patches import Circle
52+
from matplotlib.patheffects import withStroke
53+
circle = Circle((x, y), radius, clip_on=False, zorder=10, linewidth=1,
54+
edgecolor='black', facecolor=(0, 0, 0, .0125),
55+
path_effects=[withStroke(linewidth=5, foreground='w')])
56+
ax.add_artist(circle)
57+
58+
59+
def text(x, y, text):
60+
ax.text(x, y, text, backgroundcolor="white",
61+
ha='center', va='top', weight='bold', color='blue')
62+
63+
64+
# Minor tick
65+
circle(0.50, -.05)
66+
text(0.50, -0.25, "Minor tick label")
67+
68+
# Major tick
69+
circle(4.00, 2.00)
70+
text(4.00, 1.80, "Major tick")
71+
72+
# Minor tick
73+
circle(0.25, 4.00)
74+
text(0.25, 3.80, "Minor tick")
75+
76+
# Major tick label
77+
circle(-0.05, 3.00)
78+
text(-0.05, 2.80, "Major tick label")
79+
80+
# X Label
81+
circle(1.80, -0.22)
82+
text(1.80, -0.4, "X axis label")
83+
84+
# Y Label
85+
circle(-0.20, 1.80)
86+
text(-0.20, 1.6, "Y axis label")
87+
88+
# Title
89+
circle(1.60, 4.10)
90+
text(1.60, 3.9, "Title")
91+
92+
# Blue plot
93+
circle(1.75, 2.80)
94+
text(1.75, 2.60, "Line\n(line plot)")
95+
96+
# Red plot
97+
circle(1.20, 0.60)
98+
text(1.20, 0.40, "Line\n(line plot)")
99+
100+
# Scatter plot
101+
circle(3.20, 1.75)
102+
text(3.20, 1.55, "Markers\n(scatter plot)")
103+
104+
# Grid
105+
circle(3.00, 3.00)
106+
text(3.00, 2.80, "Grid")
107+
108+
# Legend
109+
circle(3.70, 3.75)
110+
text(3.70, 3.55, "Legend")
111+
112+
# Axes
113+
circle(0.5, 0.5)
114+
text(0.5, 0.3, "Axes")
115+
116+
# Figure
117+
circle(-0.3, 0.65)
118+
text(-0.3, 0.45, "Figure")
119+
120+
color = 'blue'
121+
ax.annotate('Spines', xy=(4.0, 0.35), xycoords='data',
122+
xytext=(3.3, 0.5), textcoords='data',
123+
weight='bold', color=color,
124+
arrowprops=dict(arrowstyle='->',
125+
connectionstyle="arc3",
126+
color=color))
127+
128+
ax.annotate('', xy=(3.15, 0.0), xycoords='data',
129+
xytext=(3.45, 0.45), textcoords='data',
130+
weight='bold', color=color,
131+
arrowprops=dict(arrowstyle='->',
132+
connectionstyle="arc3",
133+
color=color))
134+
135+
ax.text(4.0, -0.4, "Made with http://matplotlib.org",
136+
fontsize=10, ha="right", color='.5')
137+
138+
plt.show()

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy