我正在用多个面绘制一张GGPLATE图.我想包装方面标签,我知道我可以通过LABEL_WRAP_Gen函数来实现这一点,但是这会模糊变量名并且只显示值.如何在保留方面变量的同时包装标签?

library(ggplot2)

# Create example data
df <- data.frame(x = rnorm(100), y = rnorm(100), 
     a = sample(c("Group 1", "Group 2"), 50, replace = TRUE),
     b = sample(c("Group 1", "Group 2"), 50, replace = TRUE))

LABEL_WRAP_Gen包装标签:

# Create plot with facet wrap and custom labeller
ggplot(df, aes(x, y)) +
  geom_point() +
  facet_grid(a~b, labeller = label_wrap_gen(10))

LABEL_BOTH保留变量名称:

# Create plot with facet wrap and custom labeller
ggplot(df, aes(x, y)) +
  geom_point() +
  facet_grid(a~b, labeller = label_both)

有没有一种解决方案可以同时做到这两点?

推荐答案

我认为有两个简单的 Select :修改标签,使其包括变量名;或者创建一个结合了label_bothlabel_wrap_gen实用程序的新函数.

我会把width=从10改为6,这样我们就能看到效果了.

未更改:

ggplot(df, aes(x, y)) +
  geom_point() +
  facet_grid(a~b, labeller = label_both)

ggplot2 original, both but not wrapped

Option 1: change the faceting variables

这可能是最简单的:

transform(df, a = paste("a:", a), b = paste("b:", b)) |>
  ggplot(aes(x, y)) +
  geom_point() +
  facet_grid(a~b, labeller = label_wrap_gen(6))

ggplot2, wrapped labels with both name and value

我用了transform,可以用$<-dplyr::mutate,或者其他几种方法中的一种.这可以被泛化,以便在需要时可以通过编程来完成.当做这样的事情时,我really更喜欢如上所述地做inline,并且不在df中改变静态数据;做后一种做法有可能使我两次应用它们和/或使它们出现在不需要组合的绘图后渲染(更多的图、表)中.在这种情况下,内联操作会更"安全"一些.

Option 2: custom function

label_wrap_gen_both <- function(width = 25, multi_line = TRUE, sep = ": ") {
  fun <- function(labels) {
    value <- label_value(labels, multi_line = multi_line)
    variable <- ggplot2:::label_variable(labels, multi_line = multi_line)
    if (multi_line) {
        out <- vector("list", length(value))
        for (i in seq_along(out)) {
            out[[i]] <- paste(variable[[i]], value[[i]], sep = sep)
        }
    }
    else {
        value <- inject(paste(!!!value, sep = ", "))
        variable <- inject(paste(!!!variable, sep = ", "))
        out <- Map(paste, variable, value, sep = sep)
        out <- list(unname(unlist(out)))
    }
    lapply(out, function(st)
      vapply(strwrap(st, width = width, simplify = FALSE), paste, character(1), collapse = "\n"))
  }
  structure(fun, class = "labeller")
}

ggplot(df, aes(x, y)) +
  geom_point() +
  facet_grid(a~b, labeller = label_wrap_gen_both(6))

(剧情同上)

R相关问答推荐

如何计算新变量中的通货inflating 率?

创建计数(带重置)变量

如何在ggplot 2 geom_segment图表中将UTC转换为EET?

提取R中值和列名的所有可能组合

根据收件箱中的特定值提取列名

R等效于LABpascal(n,1)不同的列符号

如何 bootstrap glm回归、估计95%置信区间并绘制它?

随机森林回归:下拉列重要性

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

如何将旋转后的NetCDF转换回正常的纬度/经度网格,并使用R?

R函数‘paste`正在颠倒其参数的顺序

如何使用列表中多个列表中的第一条记录创建数据框

根据元素和前一个值之间的差值过滤矩阵的元素

根据类别合并(汇总)某些行

解析R函数中的变量时出现的问题

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

`夹心::vcovCL`不等于`AER::tobit`标准错误

KM估计的差异:SvyKm与带权重的调查

按组计算列中1出现的间隔年数

按组内中位数分类