2013-02-27 59 views
5

我有一個數據幀all看起來像這樣:研究 - 從數據幀創建散點圖

http://pastebin.com/Xc1HEYyH

現在我想創建與x軸的列標題的散點圖並將各個值作爲數據點。例如:

7|     x 
6|   x  x 
5| x  x  x  x  
4| x  x   x 
3|        x  x 
2|        x  x 
1| 
--------------------------------------- 
    STM STM STM PIC PIC PIC 
    cold normal hot cold normal hot 

這應該很容易,但我不知道如何。

問候

回答

8

的基本想法,如果你想使用哈德利的ggplot2是讓你的表格的數據繪製:

 x   y 
col_names  values 

而這可以通過使用哈德利的reshape2melt函數來完成。做?melt看看可能的參數。然而,在這裏,因爲我們要融化了整個data.frame,我們只需要,

melt(all) 
# this gives the data in format: 
# variable value 
# 1 STM_cold 6.0 
# 2 STM_cold 6.0 
# 3 STM_cold 5.9 
# 4 STM_cold 6.1 
# 5 STM_cold 5.5 
# 6 STM_cold 5.6 

這裏,x會再列variabley將相應value列。

require(ggplot2) 
require(reshape2) 
ggplot(data = melt(all), aes(x=variable, y=value)) + 
      geom_point(aes(colour=variable)) 

如果你不希望的顏色,那麼就刪除aes(colour=variable)內geom_point,使之成爲geom_point()

enter image description here

編輯:我也許應該提到這裏,你還可以用geom_jitter取代geom_point這會給你,好了,抖動點:

enter image description here

+0

由於這是偉大的。有沒有辦法爲x軸的每個不同值設置不同的形狀? – user1192748 2013-02-27 15:29:58

+0

是的,只需在'aes'內使用'shape = variable'就像'colour'。 – Arun 2013-02-27 15:38:21

+2

+1。我不是一個普通的ggplot2用戶,所以總是很高興看到可用的替代品。不過,有幾條評論。首先,在這種情況下真的需要傳奇嗎?我沒有看到這個特殊例子的附加價值。如果每個變量中有進一步的分組*,則可能有不同的顏色,形狀和圖例。其次,是否有可能更多地控制抖動?我發現它有點分散了抖動如何爲某些變量留下大洞,但讓其他人看起來更加聚集。 – A5C1D2H2I1M1N2O1R2T1 2013-02-28 06:23:19

5

這裏有兩個要考慮的選項。第一種使用dotplot從 「格子」 包:

library(lattice) 
dotplot(values ~ ind, data = stack(all)) 

enter image description here

第二使用從基礎R的 「圖形」 選項dotchart。要使用dotchart功能,你需要用你的data.frameas.matrix

dotchart(as.matrix(all), labels = "") 

注意,在這個圖形的點「抖動」,而是在他們錄製的順序呈現。也就是說,最低點是第一條記錄,最高點是最後一條記錄。如果你放大這個例子的情節,你會看到你有16條非常模糊的水平線。每行代表每列中的一行。因此,如果您查看「STM_cold」或任何其他具有NA值的變量的點,則會在頂部看到幾行空白行,但沒有可用的數據。

這樣做有其優點,因爲如果按時間順序記錄這些值,它可能會隨時間顯示一個趨勢,但是如果源數據框中的行數太多,也可能是一個缺點。

enter image description here

3

的使用基R圖形只是爲了好玩手動版本的位。

獲取數據:

test <- read.table(text="STM_cold STM_normal STM_hot PIC_cold PIC_normal PIC_hot 
6.0 6.6 6.3 0.9 1.9 3.2 
6.0 6.6 6.5 1.0 2.0 3.2 
5.9 6.7 6.5 0.3 1.8 3.2 
6.1 6.8 6.6 0.2 1.8 3.8 
5.5 6.7 6.2 0.5 1.9 3.3 
5.6 6.5 6.5 0.2 1.9 3.5 
5.4 6.8 6.5 0.2 1.8 3.7 
5.3 6.5 6.2 0.2 2.0 3.5 
5.3 6.7 6.5 0.1 1.7 3.6 
5.7 6.7 6.5 0.3 1.7 3.6 
NA NA NA 0.1 1.8 3.8 
NA NA NA 0.2 2.1 4.1 
NA NA NA 0.2 1.8 3.3 
NA NA NA 0.8 1.7 3.5 
NA NA NA 1.7 1.6 4.0 
NA NA NA 0.1 1.7 3.7",header=TRUE) 

設置的基本情節:

plot(
    NA, 
    ylim=c(0,max(test,na.rm=TRUE)+0.3), 
    xlim=c(1-0.1,ncol(test)+0.1), 
    xaxt="n", 
    ann=FALSE, 
    panel.first=grid() 
    ) 

axis(1,at=seq_along(test),labels=names(test),lwd=0,lwd.ticks=1) 

情節一些點,一些x軸jitter荷蘭國際集團,使他們沒有印在彼此的頂部。

invisible(
    mapply(
     points, 
     jitter(rep(seq_along(test),each=nrow(test))), 
     unlist(test), 
     col=rep(seq_along(test),each=nrow(test)), 
     pch=19 
     ) 
) 

結果:

enter image description here

編輯

下面是使用上的點Alpha透明度和與阿難在下面的評論中討論擺脫jitter的例子。

invisible(
    mapply(
     points, 
     rep(seq_along(test),each=nrow(test)), 
     unlist(test), 
     col=rgb(0,0,0,0.1), 
     pch=15, 
     cex=3 
     ) 
) 

enter image description here

+0

+1,我最初是想用帶有抖動的stripcharts思考一些東西,但是後來我發現一個點陣圖會給我顯示不是抖動的單獨點,而是它們出現在數據集中的順序。 – A5C1D2H2I1M1N2O1R2T1 2013-02-28 06:15:37

+0

@AnandaMahto - 這是你的dotchart例子,激發了這種嘗試。我猜想另外一個選項就是用低透明度(使用rgba顏色值)繪製點,並消除抖動。 – thelatemail 2013-02-28 08:09:16

+0

我認爲這樣,所以我更新了我的答案,以反映點圖答案實際上*沒有抖動。我喜歡在沒有抖動的情況下以某種方式使用Alpha通道的想法。或者,使用開放形狀(未填充)和透明度。 – A5C1D2H2I1M1N2O1R2T1 2013-02-28 08:13:01