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

如何使用R ggtern或Python Plotly.express绘制三元图拼接的六边形散点图

问题解答

可行性结论

  • 可以实现:ggtern完全支持该需求,你只需要额外引入拼接多图的工具即可;plotly.express无原生支持该类六边形拼接三元图的能力,实现成本极高,优先推荐ggtern方案。

现有代码的问题

你当前的代码直接打印6个ggtern对象,只会按顺序输出6张独立图片,不会自动拼接为六边形,同时存在两个核心问题:

  1. 旋转角度设置错误,6个三元图要拼接为正六边形,每个旋转角度需间隔60度,即0°、60°、120°、180°、240°、300°
  2. 未清理每个三元图的冗余元素(轴标签、图例、边距等),拼接后会出现大量空隙,无法严丝合缝拼成六边形

修改后的实现代码

你需要先安装patchwork包用于多图拼接,修改后的服务端渲染代码如下:

# 先安装依赖:install.packages("patchwork")
library(patchwork)

output$ggtern <- renderPlot({
  if (is.null(selectedData())) return(NULL)
  req(input$x_val, input$y_val, input$z_val, input$a_val, input$b_val, input$c_val, input$d_val)
  
  # 封装通用绘图函数,减少重复代码
  plot_tern <- function(x, y, z, rotate) {
    p <- ggtern(data=selectedData(), aes_string(x = x, y = y, z = z)) +
      {if(input$show_point) geom_point()} +
      {if(input$show_dens) geom_density_tern()} +
      theme_rotate(degrees = rotate) +
      # 清除所有冗余元素,保证拼接无空隙
      theme_nomask() +
      theme(
        axis.text = element_blank(),
        axis.title = element_blank(),
        axis.ticks = element_blank(),
        legend.position = "none",
        plot.margin = unit(c(0,0,0,0), "pt"),
        tern.panel.background = element_blank()
      )
    return(p)
  }
  
  # 生成6个角度正确的三元图
  obj1 <- plot_tern(input$x_val, input$y_val, input$z_val, 0)
  obj2 <- plot_tern(input$z_val, input$y_val, input$a_val, 60)
  obj3 <- plot_tern(input$a_val, input$y_val, input$b_val, 120)
  obj4 <- plot_tern(input$b_val, input$y_val, input$c_val, 180)
  obj5 <- plot_tern(input$c_val, input$y_val, input$d_val, 240)
  obj6 <- plot_tern(input$d_val, input$y_val, input$x_val, 300)
  
  # 拼接为六边形布局,2行3列的布局适配6个图的正六边形排列
  wrap_plots(obj1, obj2, obj3, obj4, obj5, obj6, nrow = 2, ncol = 3)
})

补充说明

如果需要实现交互式效果,可以将每个ggtern生成的静态图用ggplotly()转换为plotly对象,再调用plotly的subplot()函数拼接,但是需要手动调整每个子图的坐标位置,实现成本远高于静态方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:15:11