在刻面和使用变量列名称时如何保持颜色正确?

时间:2018-01-16 10:32:01

标签: r ggplot2 facet-wrap

我正试图制作一个这样的刻面情节:

if (object[key]) {                  // object[key] alreay exists
    object[key] = object[key] + 1;  // increment its value
} else {
    object[key] = 1;                // object[key] does not exist, initialize it with 1
}

enter image description here

但是,我正在为多个图表执行此操作,其中列名称是可变的。为了绘制x和y,这可以使用aes_string,并且没有facetting,这也适用于颜色:

example_data <- data.frame(x = rnorm(100, mean = 0, sd = 1), 
                           y = rnorm(100, mean = 0, sd = 1),
                           facet=sample(c(0,1), replace=TRUE, size=100))

ggplot(example_data, aes(x=x, y=y, colour=sign(x)!=sign(y)))+
  geom_point()+
  geom_hline(yintercept=0)+
  geom_vline(xintercept=0)+
  facet_wrap(~facet)

enter image description here

但是当我面对时,颜色不再正确了:

ggplot(example_data, aes_string(x='x', y='y', colour=sign(example_data[['x']])!=sign(example_data[['y']])))+
  geom_point()+
  geom_hline(yintercept=0)+
  geom_vline(xintercept=0)+
  guides(col=F)

enter image description here

我猜这是因为点的顺序取决于它们所处的方面。我可以通过获得每个方面的颜色来解决这个问题:

ggplot(example_data, aes_string(x='x', y='y', colour=sign(example_data[['x']])!=sign(example_data[['y']])))+
  geom_point()+
  geom_hline(yintercept=0)+
  geom_vline(xintercept=0)+
  guides(col=F)+
  facet_wrap(~facet)

enter image description here

问题是,我需要事先知道哪个方面的颜色需要在颜色矢量的开头,哪个最后。例如,在上面的代码中,如果我使用了 col_facet_0 <- sign(example_data[example_data$facet==0,][['x']])!=sign(example_data[example_data$facet==0,][['y']]) col_facet_1 <- sign(example_data[example_data$facet==1,][['x']])!=sign(example_data[example_data$facet==1,][['y']]) col <- c(col_facet_0, col_facet_1) ggplot(example_data, aes_string(x='x', y='y', colour=col))+ geom_point()+ geom_hline(yintercept=0)+ geom_vline(xintercept=0)+ guides(col=F)+ facet_wrap(~facet) ,那么颜色就会出错。

我的问题是,有没有办法在ggplot函数中执行此操作,这样我就不需要知道哪个方面必须是第一个?

1 个答案:

答案 0 :(得分:1)

您可以将表达式设为字符串,如下所示:

ggplot(example_data, aes_string(x='x', y='y', colour='sign(x) != sign(y)'))+
  geom_point()+
  geom_hline(yintercept=0)+
  geom_vline(xintercept=0)+
  guides(col=F)

如果您需要灵活的列名,可以使用例如:

x_col <- 'x'
y_col <- 'y'

ggplot(
  example_data, 
  aes_string(x_col, y_col, colour = sprintf('sign(%s) != sign(%s)', x_col, y_col))
) + ...