2015-09-10 48 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