自定义 x 轴 matplotlib

问题描述 投票:0回答:1

我已经编写了这个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 轴如下图所示(我知道这有点复杂,但不胜感激)。

enter image description here

python matplotlib
1个回答
0
投票

这里尝试使用

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

gaussian plot

© www.soinside.com 2019 - 2024. All rights reserved.