我已经编写了这个Python代码来绘制正态分布,我试图修改x轴,但是,它没有出现
import numpy as np
from scipy.stats import norm
from matplotlib import rcParams
import matplotlib.pyplot as plt
import matplotlib as mpl
# make greek symbols appear on plot
rcParams.update(mpl.rcParamsDefault)
mean = 0
standard_deviation = 1
num_points = 10**6
# Range for smooth plotting, covering 3 standard deviations
x = np.linspace(mean - 3*standard_deviation, mean + 3*standard_deviation, num_points)
kde = norm.pdf(x, mean, standard_deviation)
num_std_ticks = 4 # Number of standard deviation marks on either side
ticks = np.arange(mean - num_std_ticks * standard_deviation,
mean + (num_std_ticks + 1) * standard_deviation,
standard_deviation)
plt.plot(x, kde)
plt.suptitle("Normal Distribution", fontsize=14, fontweight='bold', y=1)
plt.title("(Empirical Rule)", fontsize=12, x=0.5, y=1.025)
plt.text(0.5, 1,
r'$\mu = ' + str(mean) + r',\sigma = ' + str(standard_deviation) + r'$',
transform=plt.gca().transAxes, ha='center', fontsize=10)
ax = plt.gca() # Get the current Axes object
ax.axis('off') # Remove all axes
ax.spines['bottom'].set_visible(True) # Show only the x-axis
ax.xaxis.set_ticks_position('bottom') # Set the tick position to the bottom
ax.set_xticks(ticks) # Set the x-ticks
plt.show()
ax.axis('off')
似乎可以很好地删除轴,但以下代码行不会将轴添加回来。我希望 x 轴如下图所示(我知道这有点复杂,但不胜感激)。
这里尝试使用
ax.yaxis.set_visible(False)
隐藏 y 轴,ax.spines[...].set_visible(False)
删除不需要的脊椎,以及 ax.xaxis.set_major_formatter(ticker.FuncFormatter(ticks_formatter))
用于 x 轴刻度上的自定义格式化程序。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import ticker
from scipy.stats import norm
mean = 0
std = 1
num_points = 10**6
# Range for smooth plotting, covering 3 standard deviations
x = np.linspace(mean - 4 * std, mean + 4 * std, num_points)
kde = norm.pdf(x, mean, std)
# Main plot
fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(x, kde)
# Titles
fig.suptitle("Normal Distribution", fontsize=14, fontweight="bold", y=1)
ax.set_title("(Empirical Rule)", fontsize=12, x=0.5, y=1.025)
ax.text(
0.5,
1,
rf"$\mu = {mean}, \sigma = {std}$",
transform=ax.transAxes,
ha="center",
fontsize=10,
)
# Deactivate y-axis, make it start from 0
ax.yaxis.set_visible(False)
ax.set_ylim(0, None)
# Let only bottom spines visible
ax.spines["top"].set_visible(False)
ax.spines["left"].set_visible(False)
ax.spines["right"].set_visible(False)
# Format x-axis ticks
num_std_ticks = 4 # Number of standard deviation marks on either side
ticks = np.arange(
mean - num_std_ticks * std,
mean + (num_std_ticks + 1) * std,
std,
)
def ticks_formatter(x, pos):
"""Need to be adpated if different mean and std"""
num_str = f"{x}\n"
if x == 0:
std_str = r"$\mu$"
else:
std_str = rf"$\mu{x:+.0f}\sigma$"
return num_str + std_str
ax.xaxis.set_major_formatter(ticker.FuncFormatter(ticks_formatter))
ax.set_xticks(ticks)
plt.show()