簡體   English   中英

控制R中ggplot2中點的順序?

[英]controlling order of points in ggplot2 in R?

假設我在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))

當我這樣做時,標記為“點”(綠色)的散點將繪制在帶有標記“ a”的紅色點的頂部。 哪些因素控制着ggplot中的z排序,即哪些因素控制着哪一點在頂部? 例如,如果我希望所有“ a”點都位於所有標記為“ point”的點上(這意味着它們有時會部分或完全隱藏該點)怎么辦? 這是否取決於標簽的字母數字順序? 我想找到一個可以輕松轉換為rpy2的解決方案。 謝謝

ggplot2ggplot2創建繪圖,並且在每一層中,繪圖順序由geom類型定義。 默認設置是按照它們在data出現的順序進行繪制。

此處有不同之處。 例如

geom_line

連接觀察值,按x值排序。

geom_path

以數據順序連接觀察


關於factors的排序也存在一些已知問題 ,有趣的是注意到軟件包作者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'))

在此處輸入圖片說明

更新資料

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

避免過度繪制問題的另一種方法是設置點的alpha (透明度)。 這將不如上面的顯式第二層方法那么有效,但是,明智地使用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))

在此處輸入圖片說明

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()

在此處輸入圖片說明

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

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

這里的基本問題可以這樣改寫:

如何控制情節的層次?

在“ 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函數進行數據處理而陷入困境。 在這里,我們要創建兩層:一層帶有“ a”標簽,一層帶有“ point”標簽。

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(...)函數之外很重要,因此我們可以按字aes(...)指定這些值。 否則,“ ggplot”功能通常將根據數據中找到的級別分配顏色和大小。 例如,如果您在數據中具有2和5的大小值,它將為值2的任何出現分配默認大小,並為值5 任何出現分配更大的大小。'aes'函數規范將請勿將值2和5用於尺寸。 顏色也一樣。 我有要使用的確切大小和顏色,因此我將這些參數移到了'geom_plot'函數本身中。 此外,“ aes”功能中的任何規范都將被添加到圖例中,這實際上是沒有用的。

最后說明 :在此示例中,您可以通過多種方式獲得所需的結果,但是了解“ ggplot2”圖層如何工作以從“ ggplot”圖表中獲得最大收益非常重要。 只要在調用“ ggplot”函數之前將數據分成不同的層,就可以控制如何在屏幕上繪制圖形。

它是按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))),]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM