python - 两个(双)轴上的线交织 zorder

标签 python matplotlib plot multiple-axes

我正在一对双轴 (twinx) 上绘制一系列线条。我可以使用 zorder 参数控制哪些线在每个轴的“顶部”,我可以使用 Axes.set_zorder()< 设置哪个轴(作为一个整体)在顶部 功能 --- 使一个轴上的所有线高于/低于另一个轴上的所有线。 有没有办法在两个轴之间交织线?

例如,我希望上图(使用双轴)的线条堆叠方式与下图(不使用双轴)相同:

import numpy as np
import matplotlib.pyplot as plt

NUM_PNTS = 100
NUM_LINES = 10
scale = np.linspace(1.0,100.0,num=NUM)[::-1]

lines_left  = [ np.random.uniform(low=-scale, high=scale, size=NUM) 
                for ii in xrange(NUM_LINES) ]
lines_right = [ 50.0 + np.random.uniform(low=-scale, high=scale, size=NUM) 
                for ii in xrange(NUM_LINES) ]
fig,ax = plt.subplots(figsize=[12,12], nrows=2)
tw = ax[0].twinx()

for ll,lr in zip(lines_left,lines_right):
    ax[0].plot(ll, c='b', lw=2.0)
    tw.plot(lr, c='r', lw=2.0)

    ax[1].plot(ll, c='b', lw=2.0)
    ax[1].plot(lr, c='r', lw=2.0)

tw.set_ylim(-150,150)
for axis in ax: axis.set_ylim(-150,150)

enter image description here

我已经尝试将 zorder 设置为间隔,但在不同的轴上它不起作用,即

for ii,(ll,lr) in enumerate(lines_left, lines_right):
    ax[0].plot(ll, c='b', lw=2.0, zorder=2*ii  )
    tw.plot(lr,    c='b', lw=2.0, zorder=2*ii+1)

最佳答案

作为艺术家,Axes 有自己的 zorder。来自 axes 文档:

set_zorder(level) Set the zorder for the artist. Artists with lower zorder values are drawn first.

ACCEPTS: any number

在一个轴内子级的 zorder 似乎是合理的,例如线,从属于多个轴之间的zorder。我认为您的代码证明了这一点。

鉴于您的目标,您可能需要重新规范第二组数据的 y 值(例如,此处为红色),将它们交错绘制,然后添加带有刻度标记的 float 脊柱标签描述红色数据的未重新标准化的 y 值。

关于python - 两个(双)轴上的线交织 zorder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31170369/

相关文章:

python - 使用 self.xxxx 作为默认参数 - Python

python - 为什么对 ndarray 进行切片会 reshape 它的形状?

python - 如何在 Seaborn 的分组箱线图中添加垂直网格线?

python - 如何使 plotly 图例跨越两列

python - 如何设置 igraph 图的大小?

r - 自动缩放 Rmarkdown 文档中 ggplot2 的字体大小(等)

python - 如何使用在虚拟环境中工作的 jupyter 笔记本全新安装 Anaconda。 window

python - 分类器对相同数据的拟合和预测给出不同的结果

python - 如何在 matplotlib python 中设置确切的日期刻度

python - 从图像中解开 "a"标签,而不丢失内容