R ggplot和geom_栏的故障

R ggplot和geom_栏的故障,r,ggplot2,bar-chart,R,Ggplot2,Bar Chart,以下是更新后的示例: 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]))

以下是更新后的示例:

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
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 0.35
5 A C d 0.59
6 A D i 0.16
7ADJ0.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 1.46
15 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)

p我认为这实际上是“ggplot”函数的一个常见错误。如果您设置了轮廓颜色(即aes(color=“red”)
),您将看到实际上正在打印所有四个值,但它们是在彼此的顶部打印的。堆叠警告是因为“位置”的默认值为“堆叠”。只要包含
position=“dodge”
参数,就可以了

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

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))

df既然您已经更改了问题,“ggplot”不能为您这样做。通过给出[df$c]级别,您可以对数据进行排序,但只能基于第一组[c]值。例如:

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

grid.newpage()
pushViewport(viewport(layout = grid.layout(1, 2)))
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_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))

a_df在这种情况下,可以忽略警告。从技术上讲,您并不是在堆叠条形图。我不知道您是否可以阻止该警告。如果您只是想让该警告消失,请参阅
suppressWarnings()
。或者,您可以使用
选项()
(但这可能不是一个好主意,因为它会抑制所有警告)。嘿,我刚刚尝试了您的示例,但它对我不起作用。它说找不到主题,如果我把它评论出来,它就会工作,但结果不是预期的我只是再试一次,它仍然工作。也许其他地方有问题?尝试直接从示例中复制粘贴,如果不起作用,请将“ggplot2”包更新为最新版本。如果您仍然有问题,请提供有关您的操作系统、R安装以及您正在使用的进程的信息,也许我们可以找到您的问题。“theme”函数是“ggplot2”的一部分,所以我有点不明白为什么会出现错误。
theme()是在最近更新的ggplot2中引入的,所以OP可能使用的是旧版本。我猜他们是在
fill=factor(b)
之后,在
geom\u bar
中添加了
position=“dodge”
,但我可能错了。这就是为什么有一个草图样本会派上用场的地方。有了一张草图,我们可以跳过所有的猜测。嘿,谢谢你的努力,给出了这个漂亮的答案。我尝试了更多,但看起来ggplot确实无法处理这种情况。因此,我会选择你们的解决方案,在illustrator中手动调整轴、图例等。无论如何,谢谢你。好办法!:)而且,是的,我可以看到现在给出的答案不再有任何意义,因为我删除了原来的问题。不会再次发生:)
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_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))