【问题标题】:Matplotlib with brokenaxes package second Y-AxisMatplotlib with brokenaxes 包第二个 Y 轴
【发布时间】:2020-02-02 13:33:11
【问题描述】:

我使用 brokenaxes 包 (https://github.com/bendichter/brokenaxes) 来打破 y 轴 (//)。现在我想要第二个 Y 轴,它也应该像第一个一样被破坏 (//)。

如何在以下示例中执行此操作?

import numpy as np
import matplotlib.pyplot as plt
from brokenaxes import brokenaxes
fig, ax = plt.subplots()
plt.gca().axes.get_yaxis().set_visible(False)

bax = brokenaxes(ylims=((0, 1.1), (60, 80)), hspace=.05)
x = np.linspace(0, 1, 100)
bax.plot(x, 5 * np.sin(10 * x) + 70)
bax.plot(x, 0.25* np.cos(40 * x) + 0.5, color="black")

ax2 = ax.twinx()
ax2.plot(x, 20 * np.sin(10 * x) + 50, color="green")

plt.show()

(在此示例中,我使用了 ax.twinx,因为我无法使其与 brokenaxes 包一起使用。此外,正弦和余弦曲线只是示例性的,在实际图中,它们是交换的。 )。

【问题讨论】:

标签: python matplotlib


【解决方案1】:

不确定,但我认为最好的解决方案是使用原生 subplots 并进行一些调整。这是一个基于Broken Axis 的示例。以下示例假设 y 轴具有不同的中断区域:

# Based on https://matplotlib.org/gallery/subplots_axes_and_figures/broken_axis.html

import numpy as np
import matplotlib.pyplot as plt


# generate data
x = np.linspace(0, 1, 100)
yleft1 = 5 * np.sin(10 * x) + 70
yleft2 = 0.25 * np.cos(40 * x) + 0.5
yright = 20 * np.sin(10 * x) + 50

# Start with subplots
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(7, 7))
fig.subplots_adjust(hspace=0.05)

# ax1 - is the top subplot
# ax2 - is the bottom subplot

# prepare twinned axes
ax3 = ax1.twinx()
ax4 = ax2.twinx()

# set limits for left y-axis
ax1.set_ylim(58, 80)
ax2.set_ylim(0, 1.1)

# set limits for right y-axis (twinned)
ax3.set_ylim(58, 80)
ax4.set_ylim(0, 34)

# turn off spines
ax1.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax3.spines['bottom'].set_visible(False)
ax4.spines['top'].set_visible(False)

# setup ticks
ax1.tick_params(bottom=False)
ax2.tick_params(bottom=True)

# plotting break diagonals
d = 0.025  # line length 
ax1.plot((-d, +d), (-d, +d), c='k', clip_on=False, transform=ax1.transAxes)
ax1.plot((1 - d, 1 + d), (-d, +d), c='k', clip_on=False, transform=ax1.transAxes)
ax2.plot((-d, +d), (1 - d, (1 + d)), c='k', clip_on=False, transform=ax2.transAxes)
ax2.plot((1 - d, 1 + d), (1 - d, 1 + d), c='k', clip_on=False, transform=ax2.transAxes)


ax1.plot(x, yleft1, c='b', label='scale1')
ax2.plot(x, yleft1, c='b', label='scale1')

ax1.plot(x, yleft2, c='k', label='scale1')
ax2.plot(x, yleft2, c='k', label='scale1')

ax3.plot(x, yright, c='g', label='scale2')
ax4.plot(x, yright, c='g', label='scale2')

ax1.legend(loc=2)
ax3.legend(loc=1)

plt.show()

【讨论】:

  • 如何为图中的两个y棘添加一个公共的ylabel?
  • @Zee 我认为最简单的方法(不创建另一个图)是text 方法fig.text(0.0, 0.5, "common ylabel", va="center", rotation="vertical")
  • 你说得对,但我的图有子图(nrows = 3,ncols = 2),每个子图都有 2 个断的 y 轴刺。我想要每个子图的公共标签(3 行 3 个 ylabels)。不是整个图的y轴
  • @Zee 这个stackoverflow.com/a/23638795/10749432 回答你的问题吗?
  • 是的。有效。只好稍微调一下。但答案有帮助。谢谢
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多