3

我对 R 相当陌生,但我正在取得良好的进展。除了一件事之外,我已经能够根据自己的意愿弯曲 ggplot2:分类标签在我的箱线图中沿 x 轴绘制的顺序。我认为这只是我对如何在公式中处理数据框范围的知识的一个漏洞,但这里是假数据,作为一个名为 df 的数据框:

Index    Label    Value
index1   A        1
index2   A        2
index3   A        3
index4   B        12
index5   B        11
index6   B        10
index7   C        8
index8   C        7
index9   C        9
...
index76  Z        15
index77  Z        17
index78  Z        16

我的绘图代码看起来像qplot(df$Label, df$Value, data=df) + scale_x_discrete("Label") + opts(axis.text.x = theme_text(angle = 90, hjust = 0, size=7)) + geom_boxplot()我想要的,它是一个箱线图,显示标签 A 的一个框和胡须,一个用于 B,一个用于 C。但是,轴按标签的顺序排列(箱线图1,2,3最接近原点,10,11,12在中间,7,8,9在图右侧)。我想要的是箱线图数据从标签平均值最高的子集开始,然后按降序进行。mean(df$Label[1:3])我可以在每个标签中按等进行平均mean(df$Label[4:6]),但我不知道如何让图表显示,以便标签的图不按照它们出现的顺序factor(df$Label)(即沿 x 的 A、B、C框位于 2、11、8 处),但按标签内平均值从高到低的顺序排列(即沿 x 的 B、C、An 和框,然后是 11、8、2 的框)。

我想我会创建一个由每个标签内平均值组成的向量,并以某种方式将其传递给 ggplot 以指定轴顺序,但我不知道如何创建向量开始。

我需要知道的是:

获得由每个标签的平均值组成的向量的最佳方法是从最高到最低的顺序是什么?

如何将该向量传递给它,ggplot以便它按这些值对 x 轴进行排序,同时仍xfactor(df$Label)

我也愿意接受有关显示数据的其他方式的建议,但我认为我非常接近我想要的,并且给定标签内值的平均值和分布很重要。

4

2 回答 2

5

这是一种方法

# create a dummy data frame
set.seed(1234)
df = data.frame(
       label = rep(letters[1:3], each = 3),
       value = sample(100, 9))

# boxplot without sorting
qplot(label, value, data = df, geom = 'boxplot')

在此处输入图像描述

# boxplot with label sorted by median of value
qplot(reorder(label, value, median), value, data = df, geom = 'boxplot')

在此处输入图像描述

于 2011-04-26T01:59:15.200 回答
0

Label是一个因素。尝试as.numeric(df$Label)查看因子的每个级别对应的数字。ggplot2 很可能按其数字级别顺序使用标签。levels您可以通过将参数传递给 来对因子的水平进行排序factor。例如,如果您将向量中的每个标签按照您想要的顺序ordered.levels=c("B","C","A",...)排列,那么您可以通过转换为字符并返回来“重新排序”标签,并使用显式levels参数:df$Label <- factor(as.character(df$Label), levels=ordered.levels)

所有这些都假设 ggplot2 使用级别的数值来对图进行排序。

于 2011-04-26T01:29:06.617 回答