使用 ggplot 绘制分组条形图

1 r bar-chart ggplot2

我是 R 新手,正在尝试创建分组条形图,但遇到一些问题。我编写了一些代码,但图表看起来并不像我想要的那样。

dveR <- data.frame(values = c(3.921, 3.557, 3.793, 3.154, 2.387, 1.906),group = rep(c("Cardia","Anterior","Posterior"),each = 2),subgroup = LETTERS[1:2])

ggplot(dveR,aes(x = group,y = values, fill = subgroup)) + geom_bar(stat = "identity",position = "dodge") + scale_fill_manual(values=c("springgreen4","orange2")
Run Code Online (Sandbox Code Playgroud)

我希望轴标签为 Y=Log Re 和 X=组织,我希望条形的顺序为贲门、前、后,但似乎按字母顺序对它们进行排序。子组标签也应该是 0 小时和 24,但我不知道如何更改它。任何帮助将不胜感激,谢谢!

小智 5

由于您是 R 新手,因此了解 R 如何处理 calcategories 变量或Factor非常重要。如果您向 R 提供数据框列中的一组字符值,它会尝试推断您想要这些值表示的内容。正如您所发现的,它并不总是能做出正确的推论。

当您在数据框的列中提供一组字符值,然后尝试在回归或图形显示中使用这些值时,R 通常会将这些值视为一个因子,但会按字母数字顺序对因子的级别进行排序。我发现自己将这些列转换为因子并指定您想要的顺序是最安全的。在这种情况下,一种方法是:

dveR$group <- factor(dveR$group)
dveR$group <- relevel(dveR$group,ref="Cardia")
Run Code Online (Sandbox Code Playgroud)

评论建议您使用fct_inorder()中的函数直接在. 该软件包可以使此类操作变得更容易,但我认为如果您在学习开始时自己进行这些操作,您会更好,这样您就可以更好地了解正在发生的事情。forcatsggplot

labs(x= "tissue", y="Log Re")注释中建议的术语是指定轴标签的一种方法。您还可以使用xlab("Tissue")ylab("Log Re")

您可以使用其他参数来scale_fill_manual()设置name图例和labels因子水平。

scale_fill_manual(values = c("springgreen4","orange2"),
                  labels = c("0","24"), name = "Hour")
Run Code Online (Sandbox Code Playgroud)

危险在于您可能会意外地混淆原始因子水平和您要求ggplot显示的水平之间的顺序。我发现在数据框中指定明确表示我想要显示的内容的因素更安全。例如,在这种情况下:

dveR[,"Hour"] <- ifelse (dveR$subgroup=="A", "0" ,"24")
Run Code Online (Sandbox Code Playgroud)

然后,按照上面的方式重新调平和group定义后Hour,您可以生成您想要的图

ggplot(dveR,aes(x = group, y = values, fill = Hour)) + 
       geom_bar(stat = "identity", position = "dodge") + 
       scale_fill_manual(values = c("springgreen4", "orange2")) + 
       xlab("Tissue") + ylab("Log Re")

Run Code Online (Sandbox Code Playgroud)

然而,对于此类数据,您可能根本不想显示条形图。正如爱德华·塔夫特(Edward Tufte)经常指出的那样,此类图占用了大量空间,却没有传达大量信息。例如,从该页面:

条形图浪费空间;您可以在现在显示 1 个数字的空间中显示至少 100 个数字。人们一直在阅读表格中的数字(参见任何好报纸的金融部分和体育部分),并且他们不需要条形图来了解 1 个数字。

此外,条形图有时会被误用(以某种方式,但您不会),将刻度的底部重置为 0 以外的值(接近范围的顶部),从而使真正小的差异看起来非常大。因此,我建议学习如何正确指定轴标签和图例,但选择不同的方式来显示此类数据。