matplotlib twinx多y轴但单个图例

matplotlib 用 twinx 画多 y 轴参考 [1]。现想在画图例时,多个 y 轴的图例画在一起,写法参考 [2]。本文展示一个简例,效果:
test.png

Code

  • 要手动指定颜色,否则原 y 轴的用色和新 y 轴会重合。
import matplotlib.pyplot as plt

# data to plot
a = [
    11859.886474338155, 11384.541612887142, 11314.948867713461, 12156.365013852563, 12404.976775275885,
    11621.437786082668, 12795.74640426193, 12993.03181918637, 12501.512233289674, 11350.26629984073,
    11590.587334446433, 11441.306187592794, 11404.947051407049, 11629.51842160388, 11763.034209161266,
    11126.219136054518, 11400.792280787551, 11272.906832672033, 11395.597850760485, 11358.659841616076,
    11379.374326229647, 11365.605541074778, 11396.632268102992, 11331.323431712111, 11332.266958200318,
    11363.32044026967, 11377.021840279784, 11323.601868202895, 11371.723693824233, 11225.02356255239,
    11257.400865610576, 11282.550566847438, 11260.885444273175, 11283.283264922617, 11270.689144877966,
    11252.21701350545, 11260.053691403413, 11253.275771074057, 11263.247947131156, 11291.757634932797,
    11292.976376828668, 11293.690639328725, 11288.613833603356, 11289.25777231545, 11287.238411511518,
    11287.257483993126, 11285.254494562952, 11296.294510594862, 11292.110325229343, 11289.720358617116
]
b = [
    0.8172, 0.8354, 0.8223, 0.8213, 0.8197,
    0.8052, 0.7974, 0.8086, 0.8036, 0.7972,
    0.806, 0.807, 0.7959, 0.7969, 0.8036,
    0.7705, 0.7851, 0.7811, 0.7788, 0.7765,
    0.7832, 0.7816, 0.784, 0.7802, 0.78,
    0.7805, 0.7788, 0.7779, 0.7831, 0.7767,
    0.7782, 0.7791, 0.778, 0.7787, 0.7788,
    0.7781, 0.7783, 0.7776, 0.7779, 0.779,
    0.7791, 0.7791, 0.779, 0.7791, 0.7789,
    0.7788, 0.7788, 0.779, 0.7788, 0.7788
]
assert len(a) == len(b)

fig, ax = plt.subplots()
# 1st y-axis
ln1 = plt.plot(range(len(a)), a, label='a', c='r') # 手动指定颜色,否则可能两线同色
ax.ticklabel_format(style='sci', scilimits=(0,3), axis='y')
ax.set_ylabel('a')
ax.set_xlabel('x')

# 2nd y-axis
zax = ax.twinx()
ln2 = zax.plot(range(len(b)), b, label='b', c='g') # 手动指定颜色,否则可能两线同色
zax.set_ylabel('b')

# legend
lines = ln1 + ln2
labels = [l.get_label() for l in lines]
ax.legend(lines, labels, fancybox=True, framealpha=0)

plt.title("multiple y-axes one legend")

fig.tight_layout()
fig.savefig("test.png", bbox_inches="tight")

References

  1. 【python】matplotlib 实现双(多)Y轴图
  2. Secondary axis with twinx(): how to add to legend
  3. matplotlib刻度值使用科学记数法
### 在Origin软件中一个Book绘制个图形的方法与限制 在Origin软件中,一个Book(工作表)可以用于绘制个图形,这主要依赖于图层的管理和数据列的选择。以下是关于如何在一个Book中绘制个图形的具体方法和可能存在的限制: #### 方法一:通过图层实现个图形 Origin支持在同一张图中添加个图层,每个图层可以独立设置坐标、刻度以及绘图样式。具体操作包括: - 在空白处右键,选择`New Layer (Axes)`来添加新的图层[^5]。 - 每个图层可以关联不同的数据列,从而实现不同图形的绘制。 - 通过`Layer Contents`界面,可以选择需要绘制的数据列,并调整其显示样式[^5]。 #### 方法二:直接添加个数据列到同一图层 在同一图层中,可以通过以下方式添加个数据列以绘制个图形: - 选中目标数据列后,使用`Graph -> Add Plot to Layer`命令将数据列添加到现有图层中[^3]。 - 双击图线或图例,分别设置每条曲线的颜色、线型以及其他属性,确保图形之间的区分[^3]。 #### 方法三:复制粘贴生成新图层 如果已经存在一个图形,可以通过复制粘贴的方式快速生成新的图层: - 将现有图形复制并粘贴到当前窗口,Origin会自动为新图形创建独立的图层[^5]。 - 调整新图层的位置、大小以及坐标设置,使其满足需求。 #### 方法四:分解与合并图层 对于复杂的绘图需求,可以利用Graph工具栏中的功能进行图层的分解与合并: - 使用`Split Graph`功能将单个图形分解为个图层[^5]。 - 或者将个图层合并为单一图形,以便统一管理。 #### 限制条件 尽管Origin提供了灵活的绘图功能,但在一个Book中绘制个图形时仍需注意以下限制: 1. **数据列的关联性**:每个图层或图线必须明确关联到Book中的特定数据列,无法随意混合不同Book的数据[^5]。 2. **图层数量的限制**:虽然理论上可以添加无限数量的图层,但过的图层可能导致性能下降或界面混乱[^5]。 3. **坐标的独立性**:如果需要双YY图形,必须确保每个图层的坐标设置正确且相互独立[^1]。 ```python # 示例代码:在Python中模拟Origin的图层绘图逻辑 import matplotlib.pyplot as plt fig, ax1 = plt.subplots() ax2 = ax1.twinx() # 创建第二个Y # 绘制第一条曲线 x = [1, 2, 3, 4] y1 = [10, 20, 25, 30] ax1.plot(x, y1, 'g-', label='Line 1') # 绘制第二条曲线 y2 = [5, 15, 20, 25] ax2.plot(x, y2, 'b-', label='Line 2') # 设置坐标标签 ax1.set_xlabel('X axis') ax1.set_ylabel('Y1 axis', color='g') ax2.set_ylabel('Y2 axis', color='b') plt.title('Dual Y-Axis Plot Example') plt.show() ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值