首页 > 解决方案 > 如何让函数在表达式()中正常执行?

问题描述

我正在尝试将一些标签部分斜体化,但仍有sum()功能,但我不知道该怎么做:

library(ggplot2)
library(reshape2)

iris_mean <- aggregate(iris[,1:4], by=list(Species=iris$Species), FUN=mean) 
iris_sd <- aggregate(iris[,1:4], by=list(Species=iris$Species), FUN=sd) 
df_mean <- melt(iris_mean, id.vars=c("Species"), variable.name = "Samples", value.name="Values")
df_sd <- melt(iris_sd, id.vars=c("Species"), variable.name = "Samples", value.name="Values")
limits <- aes(ymax = df_mean[,"Values"] + df_sd[,"Values"], ymin=df_mean[,"Values"] - df_sd[,"Values"])
df_mean$Species <- factor(df_mean$Species, levels=unique(df_mean$Species), ordered=TRUE)

ggplot(df_mean, aes(Samples, Values, fill = Species)) + 
  geom_bar(position="dodge", stat="identity") + coord_flip() + 
  theme(axis.text.y=element_text(angle=0, hjust=1)) +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    plot.margin = unit(c(1,1,.5,0),"cm"),
    legend.key.size = unit(.5, "lines"),
    axis.text.y = element_text(face = "italic")
  ) +
  scale_x_discrete("", 
                   labels= expression(
                     paste(italic("I. setosa"), " (n=", sum(iris == "setosa"), ")"),
                     paste(italic("I. versicolor"), " (n=", sum(iris == "versicolor"), ")"),
                     paste(italic("I. virginica"), " (n=", sum(iris == "virginica"), ")")))

当前情节:

当前地块

想要的情节:

所需的情节

标签: rggplot2expression

解决方案


只需查看 scale_x_discrete,您就可以做到

scale_x_discrete("", 
     labels= c(
        bquote(italic("I. setosa")*" (n="*.(sum(iris == "setosa")) * ")"),
        bquote(italic("I. versicolor")*" (n="*.(sum(iris == "versicolor")) * ")"),
        bquote(italic("I. virginica")*" (n="*.(sum(iris == "virginica")) * ")")))

在这里,我们使用bquote()将值“插入”到表达式中。我们使用调用中的.()函数来执行此操作,该函数bquote()评估当前环境中的表达式并将值插入到表达式中。

您可以使用以下命令自动创建这些

x <- c("setosa", "versicolor", "virginica")
xlabels <- lapply(x, function(spec) {
    bquote(italic(.(paste("I.", spec)))*" (n="*.(sum(iris == spec)) * ")")
})

然后使用

+ scale_x_discrete("", labels= xlabels)

推荐阅读