我正试图制作一个这样的刻面情节:
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
}
但是,我正在为多个图表执行此操作,其中列名称是可变的。为了绘制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)
但是当我面对时,颜色不再正确了:
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)
我猜这是因为点的顺序取决于它们所处的方面。我可以通过获得每个方面的颜色来解决这个问题:
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)
问题是,我需要事先知道哪个方面的颜色需要在颜色矢量的开头,哪个最后。例如,在上面的代码中,如果我使用了 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函数中执行此操作,这样我就不需要知道哪个方面必须是第一个?
答案 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))
) + ...