Python 如何在pyplot中更改Y轴上标签之间的距离?

Python 如何在pyplot中更改Y轴上标签之间的距离?,python,matplotlib,Python,Matplotlib,我正在绘制“旅行时间”,时间在x轴上,检查点在y轴上(检查点只是名称,一个检查点对应一个时间戳)。 绘图本身的代码是: if checkpoints: plt.plot_date(timestamps,checkpoints,color = "b",linestyle='solid') else: plt.plot_date(timestamps,distances,color = "b",linestyle='solid') 时间戳:小时列表:

我正在绘制“旅行时间”,时间在x轴上,检查点在y轴上(检查点只是名称,一个检查点对应一个时间戳)。 绘图本身的代码是:

if checkpoints:
  plt.plot_date(timestamps,checkpoints,color = "b",linestyle='solid')
else:
  plt.plot_date(timestamps,distances,color = "b",linestyle='solid')
时间戳:小时列表:分钟, 检查点:字符串列表, 距离:整数列表

由于检查点之间的距离不同,我需要在y轴上以不同的间距重新绘制绘图。我想,这可以通过使用距离数组作为第二个参数来实现,但我不知道如何重命名距离标签,使它们与检查点相对应

编辑:

使用的数据:

时间戳:它们由命令
datetime.strtime(时间戳,“%H:%M”)
转换并收集在数组中。 输入数据如下:

4:45 4:48 4:51 4:52 4:53 4:54 4:55 4:56 5:15 5:19 5:24 5:25 5:26 5:28 5:29 5:30 5:33 5:35 5:39 5:40 5:42 5:43 5:44 5:45 5:39 5:40 5:46 5:47 5:48 5:50 5:51 5:52
检查点:字符串数组,长度与时间戳相同。它们会定期重复以匹配时间戳:

[ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' ]
距离:类似于检查点,但它们是整数,而不是字符串

[ 0, 9, 12, 16, 18, 21, 23, 24, 0, 9, 12, 16, 18, 21, 23, 24, 0, 9, 12, 16, 18, 21, 23, 24, 0, 9, 12, 16, 18, 21, 23, 24 ]
生成带有检查点和时间戳的输出:

[ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' ]

我不喜欢检查站之间的平均距离

我想实现这一点-输出带有距离和时间戳(Y轴上的数字是距离检查点A的距离),但带有第一个示例中的标签:


成功的关键是在检查点的y轴距离中使用, 而不是它们的文本标签

您需要的数据如下:

ts = [
    '4:45', '4:48', '4:51', '4:52', '4:53', '4:54', '4:55', '4:56',
    '5:15', '5:19', '5:24', '5:25', '5:26', '5:28', '5:29', '5:30',
    '5:33', '5:35', '5:39', '5:40', '5:42', '5:43', '5:44', '5:45',
    '5:39', '5:40', '5:46', '5:47', '5:48', '5:50', '5:51', '5:52']
chkDist = [0, 9, 12, 16, 18, 21, 23, 24]
chkLbl  = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
检查点距离和标签不重复

让我们从数据转换开始。生成具有以下内容的数据帧:

  • 每行4列(将ts切成行,然后变换)
  • 索引为dist
  • 并将字符串转换为日期时间
执行此操作的代码是:

timestamps = pd.DataFrame(np.array(ts).reshape((4, -1)).T,
    index=chkDist).apply(pd.to_datetime)
日期部分取自当天,但实际上并不重要

还将检查点距离和标签转换为系列:

然后生成图片,如下所示:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

fig, ax = plt.subplots(figsize=(6, 4), constrained_layout=True)
plt.plot_date(timestamps, timestamps.index, color='b', linestyle='solid')
ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=range(0,60,15)))
ax.xaxis.set_major_formatter(mdates.DateFormatter(fmt='%H:%M'))
plt.xticks(rotation=30)
for dist, lbl in chkLabels.iteritems():
    plt.text(xLbl, dist, lbl, ha='center', va='center')
ax.set_yticks(chkDist, minor=True)
plt.grid(which='minor', linestyle='--')
plt.grid(which='major')
plt.show()
请注意,时间戳是一个数据帧,因此从它的每一列 有单独的行生成。 我使用MinuteLocator每15分钟就有x个标签 DateFormatter来格式化它们

为了打印检查点标签,我使用了额外的循环,在 标记并打印每个标签

但是请注意,plt.text的文本坐标以 数据坐标,因此:

  • y坐标取自Chklabel索引
  • 但x坐标表示为最短时间-10分钟
最后一步是打印网格。对于我使用的小线条 使用从chkDist获取的y设置_ytick。然后我打电话给plt.grid, 单独用于次要线条,并明确指定线条样式, 对于主线,使用默认属性

对于您的数据,我得到了以下结果:

请注意,检查点标签有时彼此非常接近(在 本例为G和H)。 因此,如果它们相互重叠,您应该修改代码 仅打印选定的标签,例如从
chkLabels.

欢迎来到stack overflow!既然你是新来的,请花点时间阅读。如果您提供一个包含模型数据的解决方案,您将有更好的机会获得答案。特别是,请参阅并提供您的数据(时间戳和检查点)。假设它们都是独立的系列对象,那么每个点集的位置在哪里?也许当你把你的数据包括进来的时候,你的帖子就会清楚了。你的帖子包括了距离(看起来像普通的蟒蛇列表)。它在代码中的哪个位置使用?Pyplot接受一个x轴列表和一个y轴列表。在我的代码中,我只使用距离替换了检查点,并将它们转换为整数。这就是我得到的。。。但对于检查点,唯一显示的水平线是与点相交的水平线。所以我想在左列有检查点“名称”,但它们应该与点处于相同的级别。不是数字。我修改了我的解决方案,所以现在也打印了检查点标签。我现在唯一错过的是如何在与检查点/点相同的级别上打印水平线(而不是当前的水平线-每5公里)。我在每个检查点的位置添加了小网格线,但留下了大网格线,正如您对预期结果的描述一样。只需使用
plt.yticks(距离、检查点)
。谢谢