【问题标题】:Display custom axis labels in ggplot2在 ggplot2 中显示自定义轴标签
【发布时间】:2019-12-05 09:24:22
【问题描述】:

我想在同一个图上绘制直方图和密度。我想在下面添加的是自定义 y 轴标签,类似于 sprintf("[%s] %s", ..density.., ..count..) - 一个刻度值处的两个数字。是否有可能通过scale_y_continuous 获得这个,或者我需要以某种方式解决这个问题?

低于使用scales::trans_new 和sec_axis 的当前进度。 sec_axis 是可以接受的,但最理想的输出如下图所示。

set.seed(1)
var <- rnorm(4000)
binwidth <- 2 * IQR(var) / length(var) ^ (1 / 3)


count_and_proportion_label <- function(x) {
  sprintf("%s [%.2f%%]", x, x/sum(x) * 100)
}


ggplot(data = data.frame(var = var), aes(x = var, y = ..count..)) +
  geom_histogram(binwidth = binwidth) +
  geom_density(aes(y = ..count.. * binwidth)) +
  scale_y_continuous(
    # this way
    trans = trans_new(name = "count_and_proportion",
                      format =  count_and_proportion_label,
                      transform = function(x) x,
                      inverse = function(x) x),
    # or this way
    sec.axis = sec_axis(trans = ~./sum(.),
                        labels = percent,
                        name = "proportion (in %)")
  )

在基于graphics::hist 输出之前,我尝试创建带有中断的对象 - 但这两个直方图不同。

bins <- (max(var) - min(var))/binwidth
hdata <- hist(var, breaks = bins, right = FALSE)
# hist generates different bins than `ggplot2`

最后我想得到这样的东西:

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    添加百分比作为辅助轴是否可以接受?例如

    your_plot + scale_y_continuous(sec.axis = sec_axis(~.*2, name = "[%]"))
    

    也许可以将辅助轴覆盖在主轴上,但我不确定您将如何做到这一点。

    【讨论】:

    • 以上没有解决问题,第二个比例仍然缺乏关于密度的信息。它仍然是..count..。
    • 抱歉,您是对的 - 您必须更改比例因子才能从计数转换为密度。相关更改为... sec_axis(~.*SCALE, ...。
    • 是的,这仍然是一个可以接受的解决方案。我正在尝试使用 trans_new 执行此操作,但最后应用了格式化程序,它只会得到最后的休息。
    【解决方案2】:

    您可以通过创建一组自定义标签并将其添加到绘图中来实现所需的输出:

    library(tidyverse)
    library(ggplot2)
    
    set.seed(1)
    var <- rnorm(400)
    bins <- .1
    
    df <- data.frame(yvals = seq(0, 20, 5), labels = c("[0%]", "[10%]", "[20%]", "[30%]", "[40%]"))
    df <- df %>% tidyr::unite("custom_labels", labels,  yvals, sep = " ", remove = TRUE)
    
    ggplot(data = data.frame(var = var), aes(x = var, y = ..count..)) +
      geom_histogram(aes(y = ..count..), binwidth = bins) +
      geom_density(aes(y = ..count.. * bins), color = "black", alpha = 0.7) +
      ylab("[density] count") +
      scale_y_continuous(breaks = seq(0, 20, 5), labels = df$custom_labels)
    

    【讨论】:

    • 我之前不能假设 y 中断和 y 值。我之前尝试过使用graphics::hist,但我无法重现与ggplot2中相同的输出
    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多