0

我的问题肯定是重复的,但我不知道如何实现我的目标。

这是我的数据:

v1=c(46.55172, 13.79310, 29.31034,  1.72414,  5.17241,  3.44828,  0.00000,  0.60241, 24.09639, 59.63855,  4.81928,  6.02410,  0.00000,  4.81928, 14.58333, 22.91667, 58.33333, 0.00000,  2.08333,  2.08333,  0.00000, 20.96774, 20.96774, 47.58065,  5.64516,  3.22581,  0.80645,  0.80645)

names(v1) = c('Simul','SE','Obs','CG','Double','LR','RM','Simul','SE','Obs','CG','Double','LR','RM','Simul','SE','Obs', 'CG','Double','LR','RM','Simul','SE','Obs','CG', 'Double','LR','RM')

前 7 个数字对应于第一个“期刊”,从 8 到 14 的数字对应于第二个“期刊”,依此类推......

每个期刊的七个编号分别有 Simul、SE、Obs、CG、Double、LR、RM 的名称。我希望这些数字分别代表 barplot 中七个条形的高度,并且我希望 4 个期刊在同一个窗口上。我当前的脚本就是这样做的。

par(mfrow=c(2,2))
for (journal in 0:3){
    if (journal == 0) { journal.name = 'American Naturalist'}
    if (journal == 1) { journal.name = 'Animal Behavour'}
    if (journal == 2) { journal.name = 'Ecology Letters'}
    if (journal == 3) { journal.name = 'Evolution'} 
    barplot(v1[((journal*7)+1):((journal*7)+7)],ylim=c(0,60),main=journal.name)
}
mtext('Frequency',padj=2,side=2,outer=T)
mtext('Articles Type',padj=-2,side=1,outer=T)

在此处输入图像描述

我现在想...

1)传说

...在右侧添加一个框(以及该框的空间),以添加一些具有缩写含义的图例(Simul、SE、OBS 等...)

2)文字角度

... 以 45° 的角度书写缩写词(Simul、SE、OBS 等...)。

我想实现这些事情的最佳方法是使用 ggplot 但欢迎任何答案类型!

非常感谢 !

4

2 回答 2

4

对于初学者,我建议重塑您当前的数据 ( v1) 以适应ggplot2

df = do.call("rbind",lapply(unique(names(v1)),function(x){v1[names(v1)==x]}))
rownames(df) = unique(names(v1))
colnames(df) = c("American Naturalist","Animal Behavour","Ecology Letters","Evolution")

head(df)
       American Naturalist Animal Behavour Ecology Letters Evolution
Simul             46.55172         0.60241        14.58333  20.96774
SE                13.79310        24.09639        22.91667  20.96774
Obs               29.31034        59.63855        58.33333  47.58065
CG                 1.72414         4.81928         0.00000   5.64516
Double             5.17241         6.02410         2.08333   3.22581
LR                 3.44828         0.00000         2.08333   0.80645

现在,使用reshape2

head(melt(df))
    Var1                Var2    value
1  Simul American Naturalist 46.55172
2     SE American Naturalist 13.79310
3    Obs American Naturalist 29.31034
4     CG American Naturalist  1.72414
5 Double American Naturalist  5.17241
6     LR American Naturalist  3.44828

接下来,一个基本的ggplot2条形图:

p = ggplot(melt(df)) + geom_bar(aes(x=Var1,y=value, fill=Var1), stat="identity") + facet_wrap(~Var2)

轴标签的角度:

p <- p + theme(axis.text.x = element_text(angle = 45))

在此处输入图像描述

我想你可以通过查看labs为轴标签添加解释来构建它。

正如@Aaron 所说,翻转情节可能会更好:

p + coord_flip()

在此处输入图像描述

于 2013-05-31T14:44:10.173 回答
4

好的,一方面,让我们将您的数据放入一个矩阵中。仅在向量中跟踪太难了!

v2 <- matrix(v1, nrow=7)
rownames(v2) <-  c('Simul','SE','Obs','CG','Double','LR','RM')
colnames(v2) <- c('American Naturalist','Animal Behavour','Ecology Letters','Evolution')
v2
#        American Naturalist Animal Behavour Ecology Letters Evolution
# Simul             46.55172         0.60241        14.58333  20.96774
# SE                13.79310        24.09639        22.91667  20.96774
# Obs               29.31034        59.63855        58.33333  47.58065
# CG                 1.72414         4.81928         0.00000   5.64516
# Double             5.17241         6.02410         2.08333   3.22581
# LR                 3.44828         0.00000         2.08333   0.80645
# RM                 0.00000         4.81928         0.00000   0.80645

您可能是对的,ggplot或者lattice将成为首选解决方案;这是lattice一个。

library(lattice)
library(reshape2)
v3 <- melt(v2)
names(v3) <- c("Variable", "Journal", "Frequency")
barchart(Variable~Frequency|Journal, data=v3, as.table=TRUE)

在此处输入图像描述

请注意,我已将条形设为水平,这样每个条的标签都可以轻松阅读。这比把它们放在一个角度,让你的听众头疼。这也使得只使用这些东西的全名而不只是缩写,而不是把它放在一个传说中并给你的观众鞭打成为可能。

于 2013-05-31T14:45:12.230 回答