R中ggplot2中点的控制顺序?

R中ggplot2中点的控制顺序?,r,ggplot2,rpy2,R,Ggplot2,Rpy2,假设我在R中的ggplot2中绘制一个密集散点图,其中每个点可能用不同的颜色标记: df <- data.frame(x=rnorm(500)) df$y = rnorm(500)*0.1 + df$x df$label <- c("a") df$label[50] <- "point" df$size <- 2 ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size)) df它是按data.frame中

假设我在R中的ggplot2中绘制一个密集散点图,其中每个点可能用不同的颜色标记:

df <- data.frame(x=rnorm(500))
df$y = rnorm(500)*0.1 + df$x
df$label <- c("a")
df$label[50] <- "point"
df$size <- 2
ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size))

df它是按data.frame中的行顺序绘制的。试试这个:

df2 <- rbind(df[-50,],df[50,])
ggplot(df2) + geom_point(aes(x=x, y=y, color=label, size=size))

df2
ggplot2
将逐层创建打印,在每个层中,打印顺序由
geom
类型定义。默认情况下,将按照它们在
数据中出现的顺序进行打印

如果情况不同,则应注意。比如说

geom\u线
连接观察结果,按x值排序

geom_路径
按数据顺序连接观察结果


还有,值得注意的是包作者Hadley的反应

绘图的显示应该与数据帧的顺序保持不变-其他任何内容都是错误


记住这句话,图层是按指定的顺序绘制的,因此过度绘制可能是一个问题,尤其是在创建密集散点图时。因此,如果您想要一个一致的绘图(而不是依赖于数据帧中的顺序),您需要考虑更多


创建第二层 如果希望某些值显示在其他值的上方,可以使用
subset
参数创建第二个图层,以便以后一定要绘制。您需要显式地加载
plyr
包,这样
()
就可以工作了

set.seed(1234)
df <- data.frame(x=rnorm(500))
df$y = rnorm(500)*0.1 + df$x
df$label <- c("a")
df$label[50] <- "point"
df$size <- 2
library(plyr)
ggplot(df) + geom_point(aes(x = x, y = y, color = label, size = size)) +
  geom_point(aes(x = x, y = y, color = label, size = size), 
             subset = .(label == 'point'))

或者使用
alpha
另一种避免过度抽签问题的方法是设置点的
alpha
(透明度)。这将不如上面明确的第二层方法有效,但是,明智地使用
scale\u alpha\u manual
您应该能够让一些东西发挥作用

乙二醇


这里的基本问题可以这样重新表述:

如何控制绘图的图层?

在“ggplot2”软件包中,您可以通过将每个不同的层拆分为不同的命令来快速执行此操作。从层次的角度思考需要一点实践,但本质上可以归结为在其他事物之上绘制什么。从背景向上构建

准备:准备样本数据。这个步骤只在这个例子中是必要的,因为我们没有实际的数据来处理

# Establish random seed to make data reproducible.
set.seed(1)

# Generate sample data.
df <- data.frame(x=rnorm(500))
df$y = rnorm(500)*0.1 + df$x

# Initialize 'label' and 'size' default values.
df$label <- "a"
df$size <- 2

# Label and size our "special" point.
df$label[50] <- "point"
df$size[50] <- 4

请注意,基本打印层
ggplot()
没有指定数据。这很重要,因为我们将覆盖每个层的数据。然后,我们有两个独立的点几何体层
geom_point(…)
,它们使用自己的规范。x轴和y轴将共享,但我们将使用不同的数据、颜色和大小

将颜色和尺寸规格移到
aes(…)
函数之外是很重要的,这样我们就可以直接指定这些值。否则,“ggplot”函数通常会根据数据中的级别分配颜色和大小。例如,如果数据中的大小值为2和5,它将为值2的任何引用指定默认大小,并为值5的任何引用指定更大的大小一个“aes”函数规范不会将值2和5用于大小。颜色也是如此。我有我想要使用的确切大小和颜色,所以我将这些参数移动到“geom_plot”函数本身。此外,“aes”函数中的任何规范都将被放入图例中,这可能真的没有用


最后注意事项:在本例中,您可以通过多种方式获得想要的结果,但了解“ggplot2”图层的工作原理对于充分利用“ggplot”图表非常重要。只要在调用“ggplot”函数之前将数据分成不同的层,您就可以控制屏幕上的图形显示方式。

2016更新:

顺序是美观的,因此在这一点上,最简单的方法是对data.frame进行排序,使绿点位于底部,最后绘制。如果不想更改原始data.frame,可以在ggplot调用期间对其进行排序-下面是一个使用dplyr包中的
%%>%%
排列
进行动态排序的示例:

library(dplyr)
ggplot(df %>%
         arrange(label),
       aes(x = x, y = y, color = label, size = size)) +
  geom_point()

2015年ggplot2版本的原始答案<2.0.0

在ggplot2中,可以使用指定点的打印顺序。最后绘制的图形将显示在顶部。要应用此方法,可以创建一个变量,该变量保持绘制点的顺序

通过在其他点之后绘制绿点,将绿点置于顶部:

df$order <- ifelse(df$label=="a", 1, 2)
ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size, order=order))
对于这个简单的示例,您可以跳过创建新的排序变量,只需将
标签
变量强制为一个因子,然后是一个数字:

ggplot(df) +
  geom_point(aes(x=x, y=y, color=label, size=size, order=as.numeric(factor(df$label))))

当我尝试您的代码时,绿点仍然位于所有红色的顶部。有没有办法只改变z顺序而不改变数据帧?我只是想让某些点在其他点之上,形成一个非常密集的分散体。你应该设置随机种子,使你的问题可以重复。只需按
标签对data.frame进行排序,然后将其传递到
ggplot
。如果您想先绘制绿点,请对data.frame进行排序,使带有标签
point
的行位于data.frame的顶部。不幸的是,我不知道如何将此
df[order(-as.numeric(factor(df$label)),]
转换为Rpy2语法(我使用的是Rpy2,而不是直接使用R)。对不起,我对Rpy2一无所知。您可以使用
df[order(df$label,discreating=TRUE),]
,这应该也能做到。第二种解决方案很不错,但不幸的是,彩色点W没有图例。geom_路径在这里非常有价值。。。这篇文章也很有趣:我想这是相当新的?这是一个比其他所有答案都好得多的答案。@101我很高兴你向下滚动找到了这个答案
df_layer_1 <- df[df$label=="a",]
df_layer_2 <- df[df$label=="point",]
ggplot() + 
    geom_point(
        data=df_layer_1,
        aes(x=x, y=y), 
        colour="orange", 
        size=df_layer_1$size) +
    geom_point(
        data=df_layer_2, 
        aes(x=x, y=y), 
        colour="blue", 
        size=df_layer_2$size)
library(dplyr)
ggplot(df %>%
         arrange(label),
       aes(x = x, y = y, color = label, size = size)) +
  geom_point()
df$order <- ifelse(df$label=="a", 1, 2)
ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size, order=order))
ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size, order=-order))
ggplot(df) +
  geom_point(aes(x=x, y=y, color=label, size=size, order=as.numeric(factor(df$label))))