首页 > 解决方案 > 如何在 Python 中使用正确的 X-ticks 将 (x,y) 图叠加到箱线图上?

问题描述

我正在尝试将箱线图与线图结合起来。我能够让两种不同的绘图类型一起出现在同一个图中,并使箱线图位于正确的 x 位置。但是,我想调整 x 刻度,以便定期跨越整个 x 轴。我没有任何运气使用 xlim 和 xticks 来更改刻度位置——我认为箱形图把事情搞砸了。我试过分别叠加图,但我仍然没有任何运气。下面你可以看到我试图实现的代码来覆盖这两个图。

h = [0.39, 0.48, 0.58, 0.66, 0.78, 0.94]
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(h, avg00, '--ko', label='GSE')
ax2.boxplot(phi00, widths=0.05, positions=h, showmeans=True)
ax1.set_xticks(np.arange(0.3, 1.1, 0.1))
ax1.set_xlim(0.3,1.0)
ax1.set_ylim(74,79)
ax2.set_ylim(74,79)
ax2.set_yticks([])
ax1.legend()
plt.show()

使用手头的数据创建以下图像: overlayed xy-plot 和 boxplot

任何帮助将不胜感激。谢谢!!!!

标签: pythonpython-3.xmatplotlibplotboxplot

解决方案


默认情况下,箱线图会更改刻度位置以及标签及其格式。您可以通过参数来抑制它manage_ticks=False

或者,您还可以显式设置定位器和格式化程序,例如 theMultipleLocatorScalarFormatter. 请注意,在这种情况下,twinx()轴不会增加任何价值,只会使事情复杂化。

import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, ScalarFormatter
import numpy as np

phi00 = np.random.normal(76.5, 0.7, (20, 6))
avg00 = phi00.mean(axis=0)
h = [0.39, 0.48, 0.58, 0.66, 0.78, 0.94]
fig, ax1 = plt.subplots()
ax1.plot(h, avg00, '--ko', label='GSE')
ax1.boxplot(phi00, widths=0.05, positions=h, showmeans=True, manage_ticks=False)
# ax1.xaxis.set_major_locator(MultipleLocator(0.1))
# ax1.xaxis.set_major_formatter(ScalarFormatter())
ax1.set_xlim(0.3, 1.0)
ax1.set_ylim(74, 79)
ax1.legend()
plt.show()

示例图


推荐阅读