Created
June 3, 2021 19:33
-
-
Save williamtellme123/413e5e9949f00be2ae95b97b8a9c4fff to your computer and use it in GitHub Desktop.
Anatomy of a Figure : Object-Oriented
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
import matplotlib.pyplot as plt | |
from matplotlib.ticker import AutoMinorLocator, MultipleLocator | |
np.random.seed(19680801) | |
X = np.linspace(0.5, 3.5, 100) | |
Y1 = 3+np.cos(X) | |
Y2 = 1+np.cos(1+X/0.75)/2 | |
Y3 = np.random.uniform(Y1, Y2, len(X)) | |
fig = plt.figure(figsize=(8, 8)) | |
# explicitly create a single axes | |
ax = fig.add_subplot(1, 1, 1, aspect=1) | |
def minor_tick(x, pos): | |
if not x % 1.0: | |
return "" | |
return f"{x:.2f}" | |
# Tick formatting | |
ax.xaxis.set_major_locator(MultipleLocator(1.000)) | |
ax.xaxis.set_minor_locator(AutoMinorLocator(4)) | |
ax.yaxis.set_major_locator(MultipleLocator(1.000)) | |
ax.yaxis.set_minor_locator(AutoMinorLocator(4)) | |
# FuncFormatter is created and used automatically | |
ax.xaxis.set_minor_formatter(minor_tick) | |
# Additional tick parameters | |
ax.tick_params(which='major', width=1.0) | |
ax.tick_params(which='major', length=10) | |
ax.tick_params(which='minor', width=1.0, labelsize=10) | |
ax.tick_params(which='minor', length=5, labelsize=10, labelcolor='0.25') | |
# How far the plot shows data on the x axis (may exceed ticks) | |
ax.set_xlim(0, 4) | |
ax.set_ylim(0, 4) | |
# Actual plotting | |
ax.set_title("Anatomy of a Figure: Object Oriented", fontsize=20, verticalalignment='bottom') | |
ax.set_xlabel("X axis label") | |
ax.set_ylabel("Y axis label") | |
ax.grid(linestyle="--", linewidth=0.5, color='.25', zorder=-10) | |
ax.plot(X, Y1, c=(0.25, 0.25, 1.00), lw=2, label="Blue signal", zorder=10) | |
ax.plot(X, Y2, c=(1.00, 0.25, 0.25), lw=2, label="Red signal") | |
ax.plot(X, Y3, linewidth=0, marker='o', markerfacecolor='w', | |
markeredgecolor='k') | |
ax.legend() | |
# Helper functions | |
def circle(x, y, radius=0.15): | |
from matplotlib.patches import Circle | |
from matplotlib.patheffects import withStroke | |
circle = Circle((x, y), radius, 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) | |
def text(x, y, text): | |
ax.text(x, y, text, backgroundcolor="white", | |
ha='center', va='top', weight='bold', color='blue') | |
# Minor tick label | |
circle(0.50, -0.10) | |
text(0.50, -0.32, "Minor tick label") | |
# Major tick | |
circle(-0.03, 4.00) | |
text(0.03, 3.80, "Major tick") | |
# Minor tick | |
circle(0.00, 3.50) | |
text(0.00, 3.30, "Minor tick") | |
# Major tick label | |
circle(-0.15, 3.00) | |
text(-0.15, 2.80, "Major tick label") | |
# X Label | |
circle(1.80, -0.27) | |
text(1.80, -0.45, "X axis label") | |
# Y Label | |
circle(-0.27, 1.80) | |
text(-0.27, 1.6, "Y axis label") | |
# Title | |
circle(1.60, 4.13) | |
text(1.60, 3.93, "Title") | |
# Blue plot | |
circle(1.75, 2.80) | |
text(1.75, 2.60, "Line\n(line plot)") | |
# Red plot | |
circle(1.20, 0.60) | |
text(1.20, 0.40, "Line\n(line plot)") | |
# Scatter plot | |
circle(3.20, 1.75) | |
text(3.20, 1.55, "Markers\n(scatter plot)") | |
# Grid | |
circle(3.00, 3.00) | |
text(3.00, 2.80, "Grid") | |
# Legend | |
circle(3.70, 3.80) | |
text(3.70, 3.60, "Legend") | |
# Axes | |
circle(0.5, 0.5) | |
text(0.5, 0.3, "Axes") | |
# Figure | |
circle(-0.3, 0.65) | |
text(-0.3, 0.45, "Figure") | |
ax.annotate('Spines', xy=(4.0, 0.35), xytext=(3.3, 0.5), | |
weight='bold', color=color, | |
arrowprops=dict(arrowstyle='->', | |
connectionstyle="arc3", | |
color=color)) | |
ax.annotate('', xy=(3.15, 0.0), xytext=(3.45, 0.45), | |
weight='bold', color=color, | |
arrowprops=dict(arrowstyle='->', | |
connectionstyle="arc3", | |
color=color)) | |
ax.text(4.0, -0.4, "Made with https://matplotlib.org", | |
fontsize=10, ha="right", color='.5') | |
plt.show() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment