多面面板:组内每个组的行

时间:2019-05-24 14:34:09

标签: r ggplot2

我有一个这样创建的多面面板:

totalplot <- ggplot(mtcars, 
                    aes(x=mpg,y=hp,color=gear)) +
  geom_line() +
  ggtitle("hp vs mpg") +
  xlab("mpg") + ylab("hp") +
  theme(plot.title = element_text(lineheight=.8, face="bold",
                                  size = 20)) +
  theme(text = element_text(size=15))

totalplot + facet_grid(gear ~ .,scales="free_y") # create faceted panel

enter image description here

但是对于每个面板,我希望有两行,一行用于mtcars$vs==1,另一行用于mtcars$vs==0

我尝试使用aes(x=mpg,y=hp,color=gear,interaction=(gear,vs)),但这只是给我带来奇怪的图表。

1 个答案:

答案 0 :(得分:1)

您可以通过使用group中的geom_line()美学来实现这一目的,或者为了获得更好的可读性,将其直接映射到linetype(作为一个因素):

library(ggplot2)
totalplot <- ggplot(mtcars, aes(x=mpg, y=hp, color=as.factor(gear))) +
  geom_line(aes(linetype=as.factor(vs))) +
  ggtitle("hp vs mpg") +
  xlab("mpg") + ylab("hp") +
  theme(plot.title = element_text(lineheight=.8, face="bold",
                                  size = 20)) +
  theme(text = element_text(size=15))

totalplot + facet_grid(gear ~ .,scales="free_y") # create faceted panel

mtcars并没有给您最好的例子,因为并非gear的每个级别都具有vs的两个级别。这是一个使用diamonds的类似示例,它仅包含更多数据:

library(dplyr)
library(ggplot2)
df <- select(diamonds, carat, clarity, cut, price) %>%
  filter(clarity==c("SI2", "VS2", "VVS2")) %>%
  filter(cut==c("Fair", "Ideal"))

totalplot <- ggplot(df, aes(x=carat, y=price, colour=as.factor(clarity))) +
  geom_line(aes(group=cut, linetype=cut)) +
  ggtitle("hp vs mpg") +
  xlab("mpg") + ylab("hp") +
  theme(plot.title = element_text(lineheight=.8, face="bold",
                                  size = 20)) +
  theme(text = element_text(size=15)) +
  labs(colour="Clarity", linetype="Cut") +
  facet_grid(clarity ~ .,scales="free_y") # create faceted panel
totalplot

enter image description here