首页 > 解决方案 > 分面面板:组内每个组的线条

问题描述

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

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

在此处输入图像描述

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

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

标签: rggplot2

解决方案


您可以通过使用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

在此处输入图像描述


推荐阅读