Julia heatmap在终端与IDE输出存在转置差异,如何固定为IDE效果?
问题原因
这个差异来自Plots.jl不同运行环境下的默认维度映射规则差异:
- VSCode、Atom等IDE的内置Plots显示后端,默认将输入矩阵的行维度对应y轴、列维度对应x轴,和你示例中长度为2的
List_y、长度为3的List_x、2行3列的List_f维度完全匹配,输出符合预期。 - 终端直接运行时唤起的独立plotlyjs后端,默认维度映射规则相反,会自动转置矩阵,最终出现显示差异。
可行解决方案
方案1:单图显式指定维度映射参数(最稳妥)
在heatmap调用中加入permute_dims = false参数,强制固定维度映射规则不随后端变化,修改后代码如下:
using Plots plotlyjs() List_x = [1, 2, 3] List_y = [1, 2] List_f = [0 0 0; 1 2 3] my_plot = heatmap(List_x, List_y, List_f, xlabel = "x axis", ylabel = "y_axis", permute_dims = false) # 新增固定维度参数 display(my_plot) readline()
方案2:全局固定默认规则
如果项目中所有热图都需要统一显示效果,可以在初始化后端后添加全局默认配置,后续所有heatmap调用无需额外传参:
using Plots plotlyjs() default(permute_dims = false) # 全局固定所有热图的维度映射规则
方案3:主动适配矩阵维度
如果遇到旧版本Plots不支持permute_dims参数的情况,也可以通过环境判断主动适配矩阵维度:
# IDE环境直接用原矩阵,终端环境传入转置后的矩阵 input_mat = isdefined(Main, :VSCodeServer) ? List_f : permutedims(List_f) my_plot = heatmap(List_x, List_y, input_mat, xlabel = "x axis", ylabel = "y_axis")
以上方案均可实现所有运行场景下的热图效果和IDE默认效果完全一致。
内容的提问来源于stack exchange,提问作者Nath
相关产品推荐
相关产品推荐

