下面的脚本创建一个Figure实例,该实例在辅助网格线后面具有蓝色直方图,而这些网格本身在橙色累积直方图之后。
Figure
import matplotlib.pyplot as plt import numpy as np plt.style.use("seaborn-darkgrid") np.random.seed(42) foo = np.random.randn(1000) fig, ax = plt.subplots() ax.hist(foo, bins=50) ax2 = ax.twinx() ax2.hist( foo, bins=50, density=True, cumulative=True, histtype="step", color="tab:orange" ) plt.show()
我正在寻找一种将网格线置于蓝色直方图后面的方法,并在matplotlib / matplotlib#7984找到了一个相关问题。它说
您不能将一个轴上的艺术家的绘图顺序与另一个轴上的艺术家的绘图顺序交错
这解释了为什么ax2.set_axisbelow(True)对小学阶段没有影响Axes。
ax2.set_axisbelow(True)
Axes
我能以某种方式实现我的目标吗?欢迎使用变通方法(根据以上引用,我想没有规范的解决方案)。
您所需的绘图顺序是(第一个是最后面的)
但是,正如评论所见,这是不可能的
这意味着您需要4个轴而不是2个轴。
可能看起来像这样:
import matplotlib.pyplot as plt import numpy as np np.random.seed(42) foo = np.random.randn(1000) fig, ax1a = plt.subplots() # ax1a for the histogram grid ax2a = ax1a.twinx() # ax2a for the cumulative step grid ax1b = ax1a.twinx() # ax1b for the histogram plot ax2b = ax1a.twinx() # ax2a for the cumulative step plot # Link the respective y-axes for grid and plot ax1a.get_shared_y_axes().join(ax1a, ax1b) ax2a.get_shared_y_axes().join(ax2a, ax2b) # Remove ticks and labels and set which side to label ticksoff = dict(labelleft=False, labelright=False, left=False, right=False) ax1a.tick_params(axis="y", **ticksoff) ax2a.tick_params(axis="y", **ticksoff) ax1b.tick_params(axis="y", labelleft=True, labelright=False, left=True, right=False) ax2b.tick_params(axis="y", labelleft=False, labelright=True, left=False, right=True) # Spines off for ax in [ax1a, ax2a, ax1b]: for k,v in ax.spines.items(): v.set_visible(False) ax1b.hist(foo, bins=50) ax2b.hist( foo, bins=50, density=True, cumulative=True, histtype="step", color="tab:orange" ) ax1a.grid() ax2a.grid() plt.show()