0

我有三个数组timestepsvolume。我想绘制volume(Y 轴)如何在(X 轴)上变化time并演示其timesteps(第二个 X 轴)的相关性。

time = np.array([1.280000e-07, 1.322240e-07, 1.364480e-07, 1.288448e-06,
       1.288448e-06, 1.288448e-06, 1.292672e-06, 1.292672e-06,
       1.420672e-06, 1.424896e-06, 1.429120e-06, 2.581120e-06,
       2.581120e-06, 2.581120e-06, 2.585344e-06, 2.585344e-06,
       2.586400e-06, 2.587456e-06, 2.603456e-06])

steps = np.arange(1,20)

volume = np.array([256., 384., 512., 512., 384., 256., 128.,   0., 256., 384., 512.,
   512., 384., 256., 128.,   0.,  32.,  64.,  96.])

来自的时间值time与相应的steps值相关联,例如step[1]发生在time[1]step[2]attime[2]等。

我试过twiny()了,但它似乎只有在两个轴之间的比例相同时才有效。在下图中,两个轴的值之间的间隔均匀且分布均匀。

fig, ax1 = plt.subplots(1, 1, figsize=(10, 4.5), dpi=160, facecolor='w', edgecolor='k', sharey=True)
ax1.plot(t,volume)
ax2 = ax1.twiny()
ax2.set_xticks(steps)

在此处输入图像描述

如何根据轴缩放stepstime

4

1 回答 1

2

Atwin ax是一个新的ax放置在与原始位置相同的位置,但将其刻度设置在另一侧。默认情况下,原始刻度和新刻度之间没有关系,尽管可以通过仔细设置轴限制来暗示这种关系。

相反,asecondary ax设置了刻度之间的固定关系。如果没有明确设置关系,它将是身份关系。

为了得到你想要的结果,你可以设置这样一个辅助轴,并将其steps作为标签,使用timefor 定位。

那看起来像:

import numpy as np
import matplotlib.pyplot as plt

time = np.array([1.28e-07, 1.32224e-07, 1.36448e-07, 1.288448e-06, 1.288448e-06, 1.288448e-06, 1.292672e-06, 1.292672e-06, 1.420672e-06, 1.424896e-06, 1.42912e-06, 2.58112e-06, 2.58112e-06, 2.58112e-06, 2.585344e-06, 2.585344e-06, 2.5864e-06, 2.587456e-06, 2.603456e-06])
steps = np.arange(1, 20)
volume = np.array([256., 384., 512., 512., 384., 256., 128., 0., 256., 384., 512., 512., 384., 256., 128., 0., 32., 64., 96.])

fig, ax1 = plt.subplots(1, 1, figsize=(10, 4.5),  facecolor='w', edgecolor='k')
ax1.plot(time, volume)
secax = ax1.secondary_xaxis('top')
secax.set_xticks(time)
secax.set_xticklabels(steps)
plt.show()

使用步骤作为标签的辅助轴

由于许多时间位置相同或靠近,因此生成的标签重叠。一个解决方案可能是将这些重叠的标签放在一起并创建一个标签范围:

pos = []
labels = []
start_step = steps[0]
for prev_t, t, prev_step, step in zip(time,
                                      np.append(time[1:], np.inf),
                                      steps,
                                      np.append(steps[1:], 0)):
    if (t - prev_t) > prev_t / 20:
        pos += [prev_t]
        if start_step == prev_step:
            labels += [f'{start_step}']
        else:
            labels += [f'{start_step}-{prev_step}']
        start_step = step
secax.set_xticks(pos)
secax.set_xticklabels(labels)

带有连接标签的辅助轴

于 2021-08-13T15:04:57.297 回答