创建一个镜像的、分组的条形图?

Creating a mirrored, grouped barplot?

我尝试从其他一些解决方案中改编,以适应略有不同的情况。我无法解决这个问题。

我想构建一个镜像条形图,将化学品与对照进行比较,但结果按化学品浓度分组,并且(如果可能)两个正轴。

我在下面提供数据,以及我希望它大致看起来像的示例。

volatiles<-c("hexenal3", "trans2hexenal", "trans2hexenol", "ethyl2hexanol", "phenethylalcohol", "methylsalicylate", "geraniol", "eugenol")


require(reshape2)
dat<-list(
conc1=data.frame("volatile"=volatiles, "focal"=c(26,27,28,28,31,31,30,28), "control"=c(24,31,30,29,24,23,21,25)),
conc2=data.frame("volatile"=volatiles, "focal"=c(29,18,34,17,30,32,35,27), "control"=c(21,42,20,40,25,16,17,29)),
conc3=data.frame("volatile"=volatiles, "focal"=c(33, 5,38, 7,37,35,40,26), "control"=c(18,51,14, 50,15,12,13,31))
)
long.dat<-melt(dat)

尝试以下操作无效。也许我应该输入不同的数据结构?

ggplot(long.dat, aes(x=L1, group=volatile, y=value, fill=variable)) + 
geom_bar(stat="identity", position= "identity")

我希望它看起来与此类似,但条形图以不同浓度的三元组分组(并且,如果可能,所有正值)。

提前致谢!

如 r2evans 所述,唯一的方法是在数据中使用负值,然后在标记时手动使用 abs()。更具体地说,它看起来像这样:

ggplot(long.dat, aes(x=L1, group=volatile, y=value, fill=variable)) + 
geom_bar(stat="identity", position= "identity") +
scale_y_continuous(breaks= c(-25,-15,-5,5,15,25),labels=abs(c(-25,-15,-5,5,15,25)))

当然,使用对您的数据最有意义的任何标签,或者您可以使用 seq() 函数设置一个数字序列。

P.S。我也遇到了你的代码问题,所以下次请确保你的示例是可重现的——你会更快地得到答案!

试试这个:

long.dat$value[long.dat$variable == "focal"] <-  -long.dat$value[long.dat$variable == "focal"]

library(ggplot2)
gg <- ggplot(long.dat, aes(interaction(volatile, L1), value)) +
  geom_bar(aes(fill = variable), color = "black", stat = "identity") +
  scale_y_continuous(labels = abs) +
  scale_fill_manual(values = c(control = "#00000000", focal = "blue")) +
  coord_flip()
gg

我怀疑左轴上的顺序(最初是 x,但用 coord_flip 向左翻转)将与您相关。如果电流不是您所需要的并且使用 interaction(L1, volatile) 而不是给您正确的顺序,那么您将需要智能地组合它们 before ggplot(..),转换为 factor,并控制 levels=,以便它们按您需要的顺序(和 string-formatting)排列。

大多数其他方面都可以通过 + theme(...) 控制,例如 legend.position="top"。我不知道您的演示图像中的星号可能是什么,但它们可能会添加 geom_point(确保否定那些应该在左边的星号)。

例如,如果您有一个 $star 变量指示每个特定行上应该有一个星号,

set.seed(42)
long.dat$star <- sample(c(TRUE,FALSE), prob=c(0.2,0.8), size=nrow(long.dat), replace=TRUE)
head(long.dat)
#           volatile variable value    L1  star
# 1         hexenal3    focal   -26 conc1  TRUE
# 2    trans2hexenal    focal   -27 conc1  TRUE
# 3    trans2hexenol    focal   -28 conc1 FALSE
# 4    ethyl2hexanol    focal   -28 conc1  TRUE
# 5 phenethylalcohol    focal   -31 conc1 FALSE
# 6 methylsalicylate    focal   -31 conc1 FALSE

然后您可以通过单个 geom_point 调用添加它(并添加图例移动):

gg +
  geom_point(aes(y=value + 2*sign(value)), data = ~ subset(., star), pch = 8) +
  theme(legend.position = "top")