Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在ggplot2中显示自定义轴标签_R_Ggplot2 - Fatal编程技术网

R 在ggplot2中显示自定义轴标签

R 在ggplot2中显示自定义轴标签,r,ggplot2,R,Ggplot2,我想在同一个图上绘制直方图和密度。我想添加到以下内容中的是自定义y轴标签,类似于sprintf([%s]%s“,…密度…,…计数…)-一个刻度值有两个数字。是否有可能通过缩放y__连续获得此结果,或者我是否需要以某种方式解决此问题 使用scales::trans_new和秒轴显示当前进度秒轴可以接受,但最理想的输出如下图所示 set.seed(1) var <- rnorm(4000) binwidth <- 2 * IQR(var) / length(var) ^ (1 / 3)

我想在同一个图上绘制直方图和密度。我想添加到以下内容中的是自定义y轴标签,类似于
sprintf([%s]%s“,…密度…,…计数…)
-一个刻度值有两个数字。是否有可能通过
缩放y__连续
获得此结果,或者我是否需要以某种方式解决此问题

使用
scales::trans_new
秒轴
显示当前进度<代码>秒轴可以接受,但最理想的输出如下图所示

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 %)")
  )
最后,我想得到这样的东西:


将百分比添加为次轴是否可以接受?例如

your_plot + scale_y_continuous(sec.axis = sec_axis(~.*2, name = "[%]"))
也许可以将次轴覆盖在主轴上,但我不确定您将如何进行此操作


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

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)
库(tidyverse)
图书馆(GG2)
种子(1)

上述var并没有解决这个问题,第二个量表仍然缺乏关于密度的信息。它仍然是一个
。计数..
。对不起,你说得对-你必须更改比例因子才能从计数转换为密度。相关更改将是
。。。sec_轴(~.*SCALE,…
。是的,这仍然是一个可接受的解决方案。我尝试使用
trans\u new
来实现这一点,但格式化程序在最后应用,它只得到最后的中断。我以前不能假设y中断和y值。我以前尝试过使用
graphics::hist
,但我无法再现与
ggplot2
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)