尝试从 ggplot 上的 expss 包实现 use_labels

Trying to implement use_labels from expss package on a ggplot

我有一个数据框,我使用 expss 库将标签应用于变量。 示例数据:

library(expss)
data = apply_labels(data,
state= "State",
Q1_Gender_1 = "Male",
Q1_Gender_2 = "Female")

数据的结构最终看起来像这样

dput(data)
structure(list(state = structure("Iowa", label = "State", class = c("labelled", 
"character")), Q1_Gender_1 = structure(0.11, label = "Male", class = c("labelled", 
"numeric")), Q1_Gender_2 = structure(0.89, label = "Female", class = c("labelled", 
"numeric"))), class = "data.frame", row.names = c(NA, -1L))

此数据的绘图在我应用标签之前有效,但我现在无法弄清楚如何应用 use_labels 以使用标记的变量输出绘图。

p<- data %>% 
  select(-state)%>% 
  pivot_longer(everything(), names_to="variable", values_to="value") %>%
  ggplot(aes(x = reorder(variable, value), y = value, fill = variable, text = paste0(value*100, "%"))) +
      geom_bar(stat = "identity",position = "dodge")+
      theme(axis.title.x=element_blank(),
            axis.text.x=element_blank(),
            axis.ticks.x=element_blank(),
            axis.title.y=element_blank())+
      coord_flip()+
      theme(legend.position = "none")

vignette from expss 说我应该这样申请 use_labels:

use_labels(mtcars, {
    # '..data' is shortcut for all 'mtcars' data.frame inside expression 
    ggplot(..data) +
        geom_point(aes(y = mpg, x = wt, color = qsec)) +
        facet_grid(factor(am) ~ factor(vs))
}) 

我已经尝试了所有我能想到的申请方式use_labels。我的理解是语法基本上是 use_labels(data, {exp})package documentation 也显示用法为 use_labels(data, expr) 并且它可以在其他 expss 函数中使用,例如 calculate(data, expr, use_labels = FALSE)

我需要一些帮助来弄清楚如何应用 use_labels 或者,是否有更好的解决方案来将标签应用到数据集以用于这样的绘图?

您需要将 data.frame 作为 use_labels 中的第一个参数,并使用 ..data 作为表达式中的占位符:

library(dplyr)
library(tidyr)
library(ggplot2)
library(expss)
data = structure(list(state = structure("Iowa", label = "State", class = c("labelled", 
                                                                           "character")), Q1_Gender_1 = structure(0.11, label = "Male", class = c("labelled", 
                                                                                                                                                  "numeric")), Q1_Gender_2 = structure(0.89, label = "Female", class = c("labelled", 
                                                                                                                                                                                                                         "numeric"))), class = "data.frame", row.names = c(NA, -1L))
use_labels(data, {
    ..data %>% 
        select(-state)%>% 
        drop_all_labels() %>% 
        pivot_longer(everything(), names_to="variable", values_to="value") %>%
        ggplot(aes(x = reorder(variable, value), y = value, fill = variable, text = paste0(value*100, "%"))) +
        geom_bar(stat = "identity",position = "dodge")+
        theme(axis.title.x=element_blank(),
              axis.text.x=element_blank(),
              axis.ticks.x=element_blank(),
              axis.title.y=element_blank())+
        coord_flip()+
        theme(legend.position = "none")
})

此外,我们需要删除带有 unlab 的标签,因为 pivot_longer 太聪明了,忽略了组合 labelled class.

的方法

use_labels 只需用变量标签替换 data.frame 和表达式中的所有名称。