You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:使用Python Matplotlib绘制Y轴对齐、带指定虚线的图形

Hey there! Merging separate figures is definitely a clunky way to get aligned axes and shared elements—let's fix this by building everything in a single plot setup using matplotlib (the most common library for this sort of task). Here's a step-by-step solution that hits all your requirements:

Step-by-Step Solution

1. Import Libraries & Define Your Data

First, set up your data to match the exact X-axis ticks and names you need:

import matplotlib.pyplot as plt
import numpy as np

# Define your X-axis labels (exact as your required names)
x_labels = ["Sample A", "Sample B", "Sample C", "Sample D"]
x_positions = np.arange(len(x_labels))  # Numerical positions for plotting

# Example Y datasets (replace with your actual data)
y_main = [2.5, 4.2, 3.1, 5.8]
y_secondary = [10, 18, 14, 22]

2. Create Aligned Axes (Single or Twin)

If your two datasets share the same Y-scale, just use one axis. If they need different Y-scales but you want them aligned (e.g., both zero lines match), use twin axes with alignment:

Option A: Same Y-Scale (Simplest)

fig, ax = plt.subplots(figsize=(8, 5))

# Plot your main data
ax.bar(x_positions, y_main, color='steelblue', alpha=0.7, label='Main Dataset')
# Plot secondary data if needed
ax.plot(x_positions, y_secondary, color='darkorange', marker='s', label='Secondary Dataset')

# Set X-axis exactly as required
ax.set_xlabel('Your X-Axis Title', fontsize=12)
ax.set_xticks(x_positions)
ax.set_xticklabels(x_labels)

# Y-axis setup (aligned automatically since it's a single axis)
ax.set_ylabel('Your Y-Axis Title', fontsize=12)
ax.legend()

Option B: Dual Y-Axes (Aligned at Zero)

If you need two different Y-scales but want them perfectly aligned:

fig, ax1 = plt.subplots(figsize=(8, 5))

# First dataset on primary axis
ax1.bar(x_positions, y_main, color='steelblue', alpha=0.7, label='Main Dataset')
ax1.set_xlabel('Your X-Axis Title', fontsize=12)
ax1.set_ylabel('Y-Axis 1 Label', fontsize=12)
ax1.set_xticks(x_positions)
ax1.set_xticklabels(x_labels)
ax1.legend(loc='upper left')

# Twin axis for second dataset
ax2 = ax1.twinx()
ax2.plot(x_positions, y_secondary, color='darkorange', marker='s', label='Secondary Dataset')
ax2.set_ylabel('Y-Axis 2 Label', fontsize=12)
ax2.legend(loc='upper right')

# Align both Y-axes at zero (critical for proper alignment)
y1_min, y1_max = ax1.get_ylim()
y2_min, y2_max = ax2.get_ylim()
scale = y1_max / y2_max
ax2.set_ylim(y2_min * scale, y2_max * scale)

3. Add Dashed Reference Lines

Add the dashed lines you need (horizontal, vertical, or even diagonal) using axhline() or axvline():

# Example: Horizontal dashed line at Y=4 on primary axis
ax1.axhline(y=4, color='gray', linestyle='--', linewidth=1.5, label='Threshold Line')

# Example: Vertical dashed line at "Sample B"
ax1.axvline(x=x_positions[1], color='black', linestyle=':', linewidth=1, label='Key Sample')

# Update legend to include dashed lines (if using single axis)
# ax.legend()
# Or for twin axes, add to one of the legends
ax1.legend()

4. Final Polish

Adjust layout to prevent label overlap and save/show the plot:

plt.tight_layout()
# plt.savefig('your_plot.png', dpi=300)  # Uncomment to save
plt.show()

This approach ensures your X-axis ticks/labels are identical, Y-axes are perfectly aligned, and dashed lines are integrated directly into the plot—no messy figure merging required!

内容的提问来源于stack exchange,提问作者thechargedneutron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:19:11