0

在 R 中,我想在图中插入频率(作为数字):

my code to create the plot:
par(mar=c(4.5,4.5,9.5,4), xpd=TRUE)  
plot(factor(ArtMehrspr)~Mehrspr_Vielf, data=datProjektMehr, col=terrain.colors(4), 
     bty='L', main="Vielfalt nutzen")  
legend("topright", inset=c(0,-.225), title="Art der Mehrsprachigkeit",  levels(factor(datProjektMehr$ArtMehrspr)), 
       fill=terrain.colors(4), horiz=TRUE)  
par(mar=c(5,4,4,2)+0.1) 

在此处输入图像描述

在图中,描绘了我的数据框的 2 列:ArtMehrsprMehrspr_Vielf. 现在我想知道的是,类别“1”中有多少“Kombi”,类别“1”中有多少“Paral”等等,然后在情节中打印这个数字,这样在每个盒子的情节,我可以看到相应的观察次数。R 必须知道这些数字,否则它无法根据观察次数改变不同框的高度。因此,将这些数字纳入情节并不难,不是吗?

使用 command table(),我可以获得这些数字,但我必须有 5 个table()命令才能获得所有数字。类别 = 1 的示例:

> table(subset(datProjektMehr, Mehrspr_Vielf=="1")$ArtMehrspr)  
einspr  Kombi  Paral  Versc  Wechs   
0          1       9     2       1 

显然,您可以通过添加命令来实现我想要的labels = TRUE。但它不起作用:

par(mar=c(4.5,4.5,9.5,4), xpd=TRUE, labels = TRUE)  
plot(factor(ArtMehrspr)~Mehrspr_Vielf, data=datProjektMehr, col=terrain.colors(4), 
     bty='L', main="Vielfalt nutzen")  
legend("topright", inset=c(0,-.225), title="Art der Mehrsprachigkeit", levels(factor(datProjektMehr$ArtMehrspr)), 
       fill=terrain.colors(4), horiz=TRUE)  
par(mar=c(5,4,4,2)+0.1)

R 给了我以下警告信息:

Warning message:
In par(mar = c(4.5, 4.5, 9.5, 4), xpd = TRUE, labels = TRUE) :
  "labels" is not a graphical parameter

这不是正确的命令吗?有谁知道如何做到这一点?

4

1 回答 1

0

首先,warning通知labels您不能在内部使用参数par

关于table输出的绘图,我不知道是否有一种简单的方法可以做到这一点,但我管理的代码非常不可靠,而且可能效率低下。但是,在我的机器中,它每次运行时都能正常工作。

我想到的概念是情节内部的text所有价值观。table为此,必须估计 xx' 和 yy' 中的坐标。我更喜欢术语“估计”而不是“计算”,因为我没有找到计算坐标绝对值的方法,因为该plot方法是plot.factor.

所以:

    #random data.  DF = datProjektMehr, artmehr = ArtMehrspr, mehrviel = Mehrspr_Vielf 
    DF <- data.frame(artmehr = sample(letters[1:4], 20, T), mehrviel = as.factor(sample(1:5, 20, T)))

    #your code of plotting
    par(mar = c(4.5,4.5,9.5,4), xpd = TRUE)
    plot(factor(artmehr) ~ mehrviel, data = DF, col = terrain.colors(4),
         bty = 'L', main = "Vielfalt nutzen")
    legend("topright", inset=c(0,-.225), title="Art der Mehrsprachigkeit",    levels(factor(DF$artmehr)),
           fill=terrain.colors(4), horiz=TRUE)

    #no need to "table()" many times
    tab = table(DF$artmehr, DF$mehrviel)

    #maximum value of x axis (at least in my machine)
    #I found -through trial and error- that for a factor of n levels, x.max = 1 + (n-1)*0.02
    x.max = 1 + (length(levels(DF$mehrviel)) - 1) * 0.02

    #coordinates of "mehrviel" (as I named it)
    mehrviel.coords = ((cumsum(apply(tab, 2, sum)) / sum(tab)) * x.max) - ((apply(tab, 2, sum) / sum(tab)) / 2)

    #coordinates of "artmehr" (as I named it)
    artmehr.coords <- apply(tab, 2, function(x) { cumsum(x / sum(x)) })
    artmehr.coords <- apply(artmehr.coords, 2, function(x) { x - c(x[1]/2, diff(x)/2) })

    #"text" the values in your table
    #don't plot "0"s
    for(i in 1:ncol(artmehr.coords))
     {
      text(x = mehrviel.coords[i], y = artmehr.coords[,i], labels = ifelse(tab[,i] != 0, tab[,i], ""), cex = 2)
     }

的值table

    tab
       1 2 3 4 5
     a 1 1 0 1 0
     b 0 0 2 1 2
     c 1 1 2 1 0
     d 2 0 0 3 2

剧情:

plot_example

编辑:1)“整理”答案。level2)在 xx' 轴上绘制的因子上添加了一个额外的值,以完全匹配您的数据。3)text编辑每个框中间的频率。

于 2013-10-14T15:26:18.150 回答