-->

控制作为R GGPLOT2点的顺序?(controlling order of points in

2019-08-18 06:02发布

假设我密谋在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))

当我这样做,散射点标有“点”(绿色)绘制在其带有标签“一”红点之上。 什么控制在ggplot这ž顺序,即什么控制这点是在其顶部? 例如,如果我想要的所有的“a”点上标有“点”的所有各点的上方(这意味着他们有时会部分或全部隐藏点)? 这是否取决于标签的字母顺序? 我想找到可以很容易地转换为rpy2的解决方案。 谢谢

Answer 1:

ggplot2将创建绘图层-层和每层内,绘制顺序由定义geom类型。 默认值是它们出现在顺序绘制data

如果这是不同的,需要注意。 例如

geom_line

连接观察,通过X值排序。

geom_path

连接在数据以便观察


也有关于排序已知问题factors ,而且有趣的是,包的作者哈德利的响应

曲线的显示应该是不变的数据帧的顺序 - 别的是一个错误。


这句话一点,一层是绘制按照指定的顺序,所以overplotting 可以是一个问题,创造密集的散点图时尤其如此。 所以,如果你想有一个一致的情节(而不是一个依赖于数据帧的顺序),你需要考虑多一点。


创建的第二层

如果你想一定值出现上述以外的值,你可以使用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'))

更新

ggplot2_2.0.0 ,该subset的说法已经过时了。 使用如base::subset选择在指定的相关数据data的说法。 而无需加载plyr

ggplot(df) +
  geom_point(aes(x = x, y = y, color = label,  size = size)) +
  geom_point(data = subset(df, label == 'point'),
             aes(x = x, y = y, color = label, size = size))

或者使用alpha

避免overplotting的问题的另一种方法是,设置alpha的点的(transparancy)。 这会不会是如上面明确第二层方法一样有效,然而,如果使用得当的scale_alpha_manual你应该能够得到的东西的工作。

例如

# set alpha = 1 (no transparency) for your point(s) of interest
# and a low value otherwise
ggplot(df) + geom_point(aes(x=x, y=y, color=label, size=size,alpha = label)) + 
  scale_alpha_manual(guide='none', values = list(a = 0.2, point = 1))



Answer 2:

2016更新:

订单审美已被弃用 ,所以在这一点最简单的方法是让绿色点是在底部进行排序data.frame,并绘制最后。 如果你不想改变原始data.frame,你可以在ggplot通话过程中对其进行排序-这是一个使用一个例子%>%arrange从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=-order))

对于这个简单的例子,你可以跳过创建一个新的分类变量,只是要挟label变量的因素,然后一个数字:

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


Answer 3:

最根本的问题在这里可以改写如下:

如何控制我的情节层层?

在“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

您可能注意到,我添加了一个不同大小的例子只是为了让层差异明显。

第1步 :分离你的数据分层。 始终做到这一点之前,您使用“ggplot”功能。 太多的人试图从与“ggplot”功能做数据操作卡住。 在这里,我们要创建两个层次:一个与“一”的标签,并用一个“点”的标签。

df_layer_1 <- df[df$label=="a",]
df_layer_2 <- df[df$label=="point",]

你可以与其他功能做到这一点,但我只是快速使用数据帧匹配逻辑提取数据。

步骤2:简介的数据作为层。 我们要首先绘制所有的“a”的数据,然后绘制所有的“点”的数据。

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)

注意,基极层积ggplot()没有分配数据。 这一点很重要,因为我们要覆盖数据,每一层。 然后,我们有两个不同点几何层geom_point(...)使用自己的规格。 x和y轴将被共享,但是我们将使用不同的数据,颜色和大小。

它以移动以外的颜色和大小规格是非常重要的aes(...)的功能,所以我们可以从字面上指定这些值。 否则,根据在数据中发现的水平的“ggplot”功能通常会分配颜色和大小。 例如,如果你在数据的2和5的大小值,将分配一个默认大小为值2的任何次出现,并且将一些较大尺寸分配给值5. 一种“AES”功能规范将任何出现未使用的值2和5的尺寸。 这同样适用于颜色。 我有确切的尺寸和我想使用的颜色,所以我动这些参数到“geom_plot”功能本身。 此外,在“AES”功能,任何规格将投入的传说,这可真没用。

最后说明一点 :在这个例子中,你可以在很多方面实现了想要的结果,但了解“GGPLOT2”层,以获得最出你的“ggplot”排行榜是如何工作是很重要的。 只要你将数据分成不同的层,你所说的“ggplot”功能之前,你有过怎样的事情会在屏幕上绘制大量的控制。



Answer 4:

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

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

正如你看到绿色的点,最后绘制的,因为它代表了data.frame的最后一排。

这里是一个方式订购data.frame有绿点的第一得出:

df2 <- df[order(-as.numeric(factor(df$label))),]


文章来源: controlling order of points in ggplot2 in R?
标签: r ggplot2 rpy2