<think>用户的问题是:如何在同一个子图中使用不同坐标尺度绘制折线图,具体是使用Python的matplotlib绘制双轴或多轴折线图。根据引用内容,特别是引用[1]和[3],提到了使用`twinx()`方法来实现双Y轴。引用[1]中明确说明:`axis_2=axis_1.twinx()`是在axis_1的基础上创建新的轴对象,共用x轴但使用不同的y轴刻度。这正好适用于用户的需求——在同一子图上用不同坐标尺度绘制折线图。引用[3]也提到,使用`twinx()`方法可以轻松实现双Y轴图表,共享X轴,同时展示两种不同单位的数据。因此,解决方案的核心步骤是:1.创建第一个轴对象(如`ax1`)。2.使用`ax1.twinx()`创建第二个轴对象(`ax2`),共享相同的x轴但具有独立的y轴。3.在`ax1`上绘制第一条折线图,设置其颜色、标签等。4.在`ax2`上绘制第二条折线图,设置不同的颜色、标签等。5.可以进一步添加图例、标题等元素。注意:如果需要三个y轴,可以再次使用`twinx()`并调整位置,但通常双y轴更常见,多y轴可能导致可读性下降。以下是具体的代码示例,结合引用[1]的基础代码和用户需求:```pythonimportmatplotlib.pyplotaspltimportnumpyasnp#用于示例数据#创建图像和第一个轴对象fig=plt.figure(figsize=(10,6))ax1=fig.add_axes([0.1,0.1,0.8,0.8])#主坐标系#示例数据x=np.arange(2008,2023)#2008到2022年y1=np.array([25,32,28,22,24,26,9,10,18,16,16,11,14,16,13])#第一组数据y2=np.array([192.24,84.97,65.79,48.81,126.29,152.45,135.78,72.18,45.94,55.77,44.56,116.38,8.10,24.67,23.79])#第二组数据#在第一个轴上绘制折线图(左侧Y轴)ax1.plot(x,y1,'g-',label='数量')#绿色折线ax1.set_xlabel('年份')ax1.set_ylabel('数量',color='g')#设置标签颜色与折线一致ax1.tick_params(axis='y',labelcolor='g')#Y轴刻度颜色#创建第二个轴对象,共享x轴ax2=ax1.twinx()ax2.plot(x,y2,'b-',label='损失')#蓝色折线ax2.set_ylabel('损失',color='b')#右侧Y轴标签ax2.tick_params(axis='y',labelcolor='b')#添加标题和图例plt.title('2008-2022年数量与损失变化趋势')#由于有两个轴,需要合并图例lines,labels=ax1.get_legend_handles_labels()lines2,labels2=ax2.get_legend_handles_labels()ax1.legend(lines+lines2,labels+labels2,loc='upperleft')#将图例放在左上角plt.show()```这个示例代码创建了一个双Y轴折线图,左侧Y轴为绿色(代表数量),右侧Y轴为蓝色(代表损失)。用户可以根据自己的数据替换`x,y1,y2`。如果需要更多y轴(如三个),可以继续使用`ax2.twinx()`创建`ax3`,但需要调整第三个轴的位置以避免重叠(通过设置`spines`位置)。注意:绘制多轴时,图例处理可能更复杂,建议参考matplotlib文档进行自定义。§§相关问题§§1.如何在matplotlib中调整双Y轴的颜色和标签位置?2.如果数据量纲差异很大,双Y轴如何处理?3.除了`twinx()`,matplotlib还有其他方法创建多轴吗?</think>
### Python Matplotlib 绘制双轴折线图(同一子图)
在 Matplotlib 中,使用 `twinx()` 方法可以轻松实现在同一子图中使用不同坐标尺度绘制折线图。以下是完整实现步骤和代码:
#### 1. 核心方法解析
- `twinx()`:创建共用 X 轴但具有独立 Y 轴的新坐标轴
- 优势:保持 X 轴数据对齐,同时允许不同量纲的数据在同一图中展示
- 应用场景:比较有不同单位/量级的两个数据集(如数量与百分比、温度与压力)
#### 2. 完整代码示例
```python
import matplotlib.pyplot as plt
import numpy as np
# 1. 创建画布和主坐标轴
fig, ax1 = plt.subplots(figsize=(10, 6))
fig.subplots_adjust(left=0.1, right=0.75) # 右侧留白给第二条Y轴
# 示例数据(两组不同量级的数据)
x = np.arange(2010, 2023)
y1 = np.array([25, 32, 28, 22, 24, 26, 30, 34, 36, 40, 38, 35, 42]) # 数量级约30-40
y2 = np.array([190, 85, 66, 49, 126, 152, 136, 72, 46, 56, 45, 116, 95]) # 数量级约50-200
# 2. 主Y轴数据绘制(左侧)
color1 = 'tab:blue'
ax1.set_xlabel('年份')
ax1.set_ylabel('产量 (万吨)', color=color1)
ax1.plot(x, y1, 'o-', color=color1, label='产量')
ax1.tick_params(axis='y', labelcolor=color1)
# 3. 创建副坐标轴(共用X轴)
ax2 = ax1.twinx() # 关键方法:创建第二个Y轴
color2 = 'tab:red'
ax2.set_ylabel('损失金额 (万元)', color=color2, rotation=-90, labelpad=20)
ax2.plot(x, y2, 's--', color=color2, label='损失')
ax2.tick_params(axis='y', labelcolor=color2)
# 4. 优化显示效果
plt.title('2010-2022年产量与损失趋势', fontsize=14)
plt.grid(alpha=0.3)
fig.legend(loc="upper right", bbox_to_anchor=(0.85, 0.9)) # 合并图例
plt.tight_layout()
plt.show()
```
#### 3. 关键步骤说明
1. **创建主坐标轴**
`ax1 = plt.subplots()` 创建第一个坐标轴系统
2. **添加副坐标轴**
`ax2 = ax1.twinx()` 生成共享X轴的新Y轴系统
3. **定制化双轴**
- 为每个轴单独设置 `set_ylabel()`
- 使用 `tick_params()` 区分刻度颜色
- 通过 `color` 参数区分不同数据系列
4. **图例处理技巧**
- 通过 `label` 参数为每条线添加标签
- `fig.legend()` 合并两个轴的图例
#### 4. 三轴扩展方案
使用 `ax3 = ax1.twinx()` 创建第三条轴后,调整位置:
```python
ax3.spines['right'].set_position(('axes', 1.1)) # 右移10%
```
### 注意事项
1. **轴标签对齐**:右侧Y轴标签使用 `rotation=-90` 保持竖直显示
2. **颜色选择**:使用明显对比色(如蓝/红)提高可读性
3. **量级差异**:双Y轴适合显示趋势关系,但需避免刻意扭曲数据
4. **图例位置**:通过 `bbox_to_anchor` 精细调整图例位置
[^1]: 通过 `twinx()` 方法实现坐标轴复用
[^2]: 数据绘图采用分离颜色标记策略
[^3]: 多轴布局需手动调整间距