2015-09-10 78 views
1

我有以下不能映射到列名:GGPLOT2 geom_point圖

> x.row10 
                 2003 2004 2005 2006 2007 2008 2009 2012 
drift av bil           12770 12440 14910 12640 16230 16000 16260  NA 
utemåltider           5700 6600 6050 7830 8870 7990 7580 9860 
resor, hotell           5620 5820 7960 9600 8210 9390 9890  NA 
möbler, inventarier, textilier , hushållsutrustning 8540 10840 13400 9450 9910 11860 10430 13040 
hyra/avgift för hyres-/borätt (inkl garage)   43360 44020 45160 49430 45370 44090 48740  NA 
köpta livsmedel          26420 27910 28160 29100 28310 33020 35910 33740 
hushållstjänster          9490 11690 13770 8650 7250 10390 11490 17140 
transport           27230 30810 28810 28410 30500 30390 29360 34890 
bostad            67890 67250 71200 75210 71000 73490 74710 81820 
fritid och kultur         34900 35860 43600 46770 43540 46160 45840 51000 
totala utgifterna         215300 219870 241920 241060 229290 253590 255950 277260 

一些數據,我想創建一個映射到x變量colnames並映射到y變量rownames一個ggplot。基本上我只是想分別在圖表上繪製每年的所有行名的數據點。這與顯示不同行名稱的顏色恐懼因子圖例一起使用。

我嘗試

ggplot(x.row10, aes(x = colnames(x.row10), y = rownames(x.row10))) + geom_point() 

,但我得到

Error: Aesthetics must either be length one, or the same length as the dataProblems:colnames(x.row10)

這又如何解決?

+1

嘗試使行名稱成爲第一列。然後融化數據框。 rownames將會是一個變量,而其他的變項是其他變量。 –

+0

將行名提取到一個變量,並使用'熔化'或'聚集'來重塑你的data.frame到長形式 – scoa

+0

@PierreLafortune你的意思是熔化數據框是什麼意思? – uncool

回答

3

一般而言,ggplot喜歡「長數據」,其中每行都是一個度量值,而不是將它們分組。要解決這個問題,我們可以使用包tidyr使數據變長(或融化)。您可能想看看dat2,作爲「長」或「融化」數據的示例。

library(dplyr) 
library(tidyr) 

dat2 <- x.row10 %>% mutate(type = row.names(.)) %>% 
        gather(year, val, -type) %>% 
        mutate(year = extract_numeric(year)) 

ggplot(dat2, aes(x = year, y = val, colour = type)) + geom_line() 

下面是輸出: enter image description here

隨着數據是很難得到的,這就是我使用(NB可能會有一些差異,如果你想要一個確切的代碼,嘗試添加一個​​到您的問題)

structure(list(X2003 = c(12770L, 5700L, 5620L, 8540L, 43360L, 
26420L, 9490L, 27230L, 67890L, 34900L, 215300L), X2004 = c(12440L, 
6600L, 5820L, 10840L, 44020L, 27910L, 11690L, 30810L, 67250L, 
35860L, 219870L), X2005 = c(14910L, 6050L, 7960L, 13400L, 45160L, 
28160L, 13770L, 28810L, 71200L, 43600L, 241920L), X2006 = c(12640L, 
7830L, 9600L, 9450L, 49430L, 29100L, 8650L, 28410L, 75210L, 46770L, 
241060L), X2007 = c(16230L, 8870L, 8210L, 9910L, 45370L, 28310L, 
7250L, 30500L, 71000L, 43540L, 229290L), X2008 = c(16000L, 7990L, 
9390L, 11860L, 44090L, 33020L, 10390L, 30390L, 73490L, 46160L, 
253590L), X2009 = c(16260L, 7580L, 9890L, 10430L, 48740L, 35910L, 
11490L, 29360L, 74710L, 45840L, 255950L), X2012 = c(NA, 9860L, 
NA, 13040L, NA, 33740L, 17140L, 34890L, 81820L, 51000L, 277260L 
)), .Names = c("X2003", "X2004", "X2005", "X2006", "X2007", "X2008", 
"X2009", "X2012"), class = "data.frame", row.names = c("drift av bil", 
"utemåltider", "resor, hotell", "möbler, inventarier, textilier , hushållsutrustning", 
"hyra/avgift för hyres-/borätt (inkl garage)", "köpta livsmedel", 
"hushållstjänster", "transport", "bostad", "fritid och kultur", 
"totala utgifterna")) 
+0

在更改建議(標準)的重塑包或tidyr之間? – uncool

+1

'tidyr'是來自'reshape2'和'reshape'的同一作者的新版本 - 兩者都很好,但如果你從頭開始學習,我會推薦'tidyr'(有些人會不同意或推薦數據。 ') – jeremycg

+2

注意:'dplyr'有一個方便的函數'%>%add_rownames(「type」)',它比mutate(type = row.names(。))'可讀性更好。 – lukeA