2

这里更新的例子:

df <- data.frame(a=rep(c("A","B"),each=10),
                 b=rep(rep(c("C","D"),each=5),2),
                 c=c(sample(letters[1:5]), sample(letters[6:10]),           
                     sample(letters[1:5]), sample(letters[6:10])),
                 d=c(0.10,0.18,0.34,0.35,0.59,0.16,0.38,0.40,0.53,0.58,
                     0.37,0.62,0.83,1.46,-0.91,-0.79,-0.52,-0.43,-0.01,0.34))

> df
   a b c     d
1  A C b  0.10
2  A C e  0.18
3  A C a  0.34
4  A C c  0.35
5  A C d  0.59
6  A D i  0.16
7  A D j  0.38
8  A D h  0.40
9  A D f  0.53
10 A D g  0.58
11 B C e  0.37
12 B C d  0.62
13 B C a  0.83
14 B C c  1.46
15 B C b -0.91
16 B D f -0.79
17 B D i -0.52
18 B D h -0.43
19 B D j -0.01
20 B D g  0.34

如果仔细观察,您会发现 d 列在 b 列中总是从小到大排序。

第一个情节是我希望情节与事实不同的事实,即显示的条形不是按 d 的顺序。所以条形图不会从小到大出现:

p <- ggplot(df, aes(x=c, y=d, fill=b, stat="identity")) +

facet_grid(. ~ a) +

geom_bar()  

print(p)

条形图1

这是因为 c 列是一个因子,并且这些因子的排序显然与 d 列的顺序不同。所以我做了以下事情:

df$c <- paste(1:nrow(df), df$c, sep="_")

df$c <- factor(df$c, levels = unfactor(df$c))

p <- ggplot(df, aes(x=c, y=d, fill=b, stat="identity")) +

            facet_grid(. ~ a) +

            geom_bar()  

print(p)

产生以下情节:

在此处输入图像描述

这里的顺序是正确的。但是,正如您所看到的,我创建了独特的因素,我分别为 A 和 B 中不存在的那些空间获得了这些空间。

我该如何解决?

4

2 回答 2

0

我认为这实际上是“ggplot”函数的一个常见错误。如果您设置轮廓颜色(即aes(colour="red")),您将看到您实际上是在绘制所有四个值,但它们是在彼此之上绘制的。堆叠警告是因为 'position' 的默认值是“stack”。只需包含position="dodge"论点,它就会消失。

现在,要实际解决您的问题。你需要给 'ggplot' 一些东西来区分 X(A)、X(B)、Y(A) 和 Y(B) 的值。乍一看,您可能很想使用 [b] 值,但您不想要所有额外的空格。让我们调整您的数据框,使 [b] 只有 1s 和 2s:

df <- data.frame(a=rep(rep(c("A","B"),each=2),2), 
b=rep(1:2,4), 
c=rep(c("X","Y"),each=4), 
d=c(1.2,1.1,1.15,1.1, -1.1,-1.05,-1.2,-1.08))

一旦你知道问题,情节实际上很容易修复。首先,将 [b] 设置为您的 x 轴,并将 [a] 添加到您的构面。然后使用带有空白元素的“主题”从 [b] 中删除所有烦人的乱码:

p <- ggplot(NULL, aes(x=b, y=d)) +      
facet_grid(. ~ c + a) +
geom_bar(data = df, stat="identity", position="dodge") +
theme(axis.ticks = element_blank(), axis.text.x = element_blank(), axis.title.x = element_blank())

print(p)

如果这不是您想要的,它至少应该足够接近,您只需要进行外观更改。祝你好运!

于 2013-01-25T16:49:38.383 回答
0

现在你已经改变了问题,'ggplot' 不能为你做这件事。通过给出 [df$c] 级别,您可以对数据进行排序,但只能基于第一组 [c] 值。例如:

df$c <- factor(df$c, levels=levels(df$c)[order(df$d)])

但这不起作用,因为您尝试对 [df$c] 进行两次排序(一次用于“A”,一次用于“B”)。

您确实需要将其分成两个单独的图,然后将两个视口彼此相邻地绘制。

设置视口

grid.newpage()
pushViewport(viewport(layout = grid.layout(1, 2)))

地块 A

a_df <- df[df$a=="A",]
a_df$c <- factor(a_df$c, levels=levels(a_df$c)[order(a_df$d)])

a_p <- ggplot(a_df, aes(x=1:10, y=d, fill=b)) +
facet_grid(. ~ a) +
geom_bar(stat="identity", position="dodge")

print(a_p, vp = viewport(layout.pos.row=1, layout.pos.col=1))

B地块

b_df <- df[df$a=="B",]
b_df$c <- factor(b_df$c, levels=levels(b_df$c)[order(b_df$d)])

b_p <- ggplot(b_df, aes(x=1:10, y=d, fill=b)) +
facet_grid(. ~ a) +
geom_bar(stat="identity", position="dodge")

print(b_p, vp = viewport(layout.pos.row=1, layout.pos.col=2))

从这里,您可以担心删除多余的图例,选择要标记的轴等,但它看起来与您的示例图完全相同,只是删除了空位置。

这确实是一个例子,说明“ggplot”有时更像是一种障碍,而不是一种恩惠。以我的经验,最好先设计你的情节,然后选择工具。经常,我发现自己回到原始的“网格”来做我的视觉效果,因为我想要一些“网格”包装器“ggplot”做不到的东西。

注意:以后不要删除你原来的问题内容;只需添加更新的信息。删除旧内容使该页面上的许多答案和评论变得无关紧要。

于 2013-01-25T19:22:32.910 回答