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

Kotlin中Lets-Plot的FacetGrid外观自定义问题求助

Kotlin中Lets-Plot的FacetGrid外观自定义问题求助

嘿,我来帮你逐个搞定这些FacetGrid的自定义需求,结合你给出的Lets-Plot代码,直接上可落地的修改方案:


1. 把"Destination"标签移到网格上方

你当前的scaleXContinuous(name = "Destination")会把标题放在x轴下方,要移到整个网格上方,只需调整主题里axisTitleX的位置参数,同时给顶部留出足够的边距:

theme(
    // 其他主题设置...
    axisTitleX = elementText(size = 60, vjust = -8, hjust = 0.5), // vjust负数让标题往上移
    plotMargin = margin(t = 100, r = 20, b = 20, l = 20) // 顶部边距给标题腾空间
)

2. 放大A-T的对象标签(Facet标题)

这些标签是Facet的标题,对应theme里的stripTextX(x方向Facet)和stripTextY(y方向Facet),直接设置它们的字号即可:

theme(
    // 其他主题设置...
    stripTextX = elementText(size = 45), // 按需调整字号大小
    stripTextY = elementText(size = 45)
)

3. 把右侧的对象标签移到左侧

在facetGrid里添加switch = "y"参数,就能把y轴方向的Facet标签从右侧切换到左侧:

facetGrid(y = "group1", x = "group2", switch = "y")

4. 放大图例的Key

你已经设置了legendKeySize,只需调大数值就能让图例Key变大:

theme(
    // 其他主题设置...
    legendKeySize = 120 // 比原来的100更大,按需调整
)

5. 让中心圆点按Facet总数量变色(对数刻度)+ 6. 单独的对数颜色渐变图例

首先得计算每个Facet的总数量,再把这个数据映射到中心圆点的颜色上,最后用对数刻度的颜色渐变:

// 步骤1:计算每个Facet的总数量
val facetTotals = sortedDataList.groupBy { Pair(it.group1, it.group2 ?: "") }
    .mapValues { it.value.sumOf { dp -> dp.quantity } }
val dataWithTotal = sortedDataList.map {
    it.copy(totalQuantity = facetTotals[Pair(it.group1, it.group2 ?: "")] ?: 0.0)
}

// 步骤2:更新数据map,加入totalQuantity字段
val data = mapOf(
    "group1" to dataWithTotal.map { it.group1 },
    "group2" to dataWithTotal.map { it.group2 ?: "" },
    "quantity" to dataWithTotal.map { it.quantity },
    "delay" to dataWithTotal.map { it.delay },
    "totalQuantity" to dataWithTotal.map { it.totalQuantity } // 新增总数量字段
)

// 步骤3:修改geomPoint和颜色刻度
val plot = ggplot(data) { weight = "quantity"; fill = "delay" } +
    geomPoint(shape = 16, size = 38, color = "totalQuantity") + // 把颜色映射到总数量
    scaleColorLog10(low = "white", high = "black", name = "Total Quantity (Log)") + // 对数颜色渐变,自动生成单独图例
    // 其他原有图层...

7. 在中心圆点上显示Facet总数量

需要单独准备一份总数量的数据集,然后用geomText在每个Facet的中心位置绘制文本:

// 准备总数量数据集(每个Facet对应一条数据)
val totalTextData = facetTotals.map { (key, total) ->
    DelayDataPoint(key.first, key.second, total, "")
}

// 在plot里添加文本图层
val plot = ggplot(data) { weight = "quantity"; fill = "delay" } +
    // 其他原有图层...
    geomText(
        data = totalTextData,
        mapping = aes(x = 0.5, y = 0.5, label = "quantity"), // coordFixed下中心位置是(0.5,0.5)
        size = 12, // 调整文本大小
        color = "white" // 白色文本和深色圆点形成对比
    ) +
    // 其他原有设置...

把这些修改整合到你的代码里,应该就能实现你想要的所有效果啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:28:02