创建一个镜像的、分组的条形图?
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")
我尝试从其他一些解决方案中改编,以适应略有不同的情况。我无法解决这个问题。
我想构建一个镜像条形图,将化学品与对照进行比较,但结果按化学品浓度分组,并且(如果可能)两个正轴。
我在下面提供数据,以及我希望它大致看起来像的示例。
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")