Plots.jl子图调用twinx()实现双Y轴时link=:x联动异常问题
问题原因
twinx()的本质是生成一个与目标轴共享X轴的独立次轴对象,而非原轴的内置属性- 原代码的核心错误是变量覆盖:执行
b = scatter!(twinx(), x, z, color = :orange, legend = false)时,scatter!的返回值是新生成的次轴对象,直接覆盖了之前存储绿色折线主图的b变量。最终传入布局的b仅为橙色散点对应的次轴,绘制绿色折线的主图轴没有被显式纳入布局管理 link=:x参数仅会对传入plot()的顶层子图轴生效,未被纳入布局列表的主图轴不会触发联动规则,最终出现轴范围错位、元素显示异常的问题
修正代码
不要用次轴对象覆盖原主图变量,显式指定twinx()绑定的主图,最后组装布局时传入主图对象即可:
using Plots x = [3, 5, 7, 9] y = [10, 20, 30, 40] z = [-10, -20, -30, -40] # 第一个子图 a = plot(1:10, color = :black, legend = false) # 第二个子图主Y轴 b = plot(x, y, color = :green, legend = false) # 绑定主图生成次Y轴,绘制散点时不覆盖原主图变量 b_twin = twinx(b) scatter!(b_twin, x, z, color = :orange, legend = false) # 传入主图组装布局,link=:x会自动识别关联的同X次轴完成联动 plot(a, b, layout = (2, 1), link=:x)
运行说明
修正后上下子图X轴可正常联动缩放、平移,下方子图会同时显示左侧对应绿色折线的主Y轴、右侧对应橙色散点的次Y轴,无元素丢失、轴错位问题。
内容的提问来源于stack exchange,提问作者Vautrin Balzac
相关产品推荐
相关产品推荐

