ggplot2 geom_bar - 如何保持数据框的顺序

38

我有一个关于 geom_bar 数据顺序的问题。

这是我的数据集:

  SM_P,Spotted melanosis on palm,16.2
  DM_P,Diffuse melanosis on palm,78.6
  SM_T,Spotted melanosis on trunk,57.3
  DM_T,Diffuse melanosis on trunk,20.6
  LEU_M,Leuco melanosis,17
  WB_M,Whole body melanosis,8.4
  SK_P,Spotted keratosis on palm,35.4
  DK_P,Diffuse keratosis on palm,23.5
  SK_S,Spotted keratosis on sole,66
  DK_S,Diffuse keratosis on sole,52.8
  CH_BRON,Dorsal keratosis,39
  LIV_EN,Chronic bronchities,6
  DOR,Liver enlargement,2.4
  CARCI,Carcinoma,1

我指定以下列名:

  colnames(df) <- c("abbr", "derma", "prevalence") # Assign row and column names

然后我绘制:

  ggplot(data=df, aes(x=derma, y=prevalence)) + geom_bar(stat="identity") + coord_flip()

绘图

为什么ggplot2会随机更改我的数据顺序。我希望数据的顺序与我的data.frame一致。

非常感谢您的任何帮助!


1
这不是随机的,而是按字母顺序排列的。请参见此处的解决方案https://dev59.com/D3A75IYBdhLWcg3wg5Zh - arvi1000
你正在重新调整derma2因子,但随后使用了x=derma - arvi1000
嗨,阿尔维。首先感谢你的耐心等待。我不是很明白,因为如果我打开我的df,df $ derma和df $ derma2的顺序完全相同。所以,如果我更改绘图的df$,它并没有什么影响。 - Stücke
你的数据框中行的顺序并不重要。重要的是因子水平的顺序:levels(df$derma)。你可以按任意顺序放置它们以进行绘图。 - Gregor Thomas
@jaap 我认为这个问题(即如何停止列的重新排序)与如何重新排序列的问题略有不同,但非常重要。我认为基于这个原因重新开放这个问题会非常有用。原因是,如果在工作流程中先确定了顺序,则当前最佳答案会使其发生:i)确定顺序,ii)ggplot重新排序,iii)(最佳答案)再次重新排序。如果数据最初处于正确的顺序,并且存在某种(任何)方法可以防止geom_bar重新排序,则这没有太多意义。 - stevec
显示剩余2条评论
1个回答

64

因为评论串太长,所以我将其作为回答发布。你必须使用变量的因子水平来指定排序方式,这个变量是与 aes(x=...) 映射的。

# lock in factor level order
df$derma <- factor(df$derma, levels = df$derma)

# plot
ggplot(data=df, aes(x=derma, y=prevalence)) + 
    geom_bar(stat="identity") + coord_flip()

结果与 df 中的顺序相同: 输入图片说明

# or, order by prevalence:
df$derma <- factor(df$derma, levels = df$derma[order(df$prevalence)])

相同的绘图命令会产生如下结果:

enter image description here


我是这样读取数据的:

read.table(text=
"SM_P,Spotted melanosis on palm,16.2
DM_P,Diffuse melanosis on palm,78.6
SM_T,Spotted melanosis on trunk,57.3
DM_T,Diffuse melanosis on trunk,20.6
LEU_M,Leuco melanosis,17
WB_M,Whole body melanosis,8.4
SK_P,Spotted keratosis on palm,35.4
DK_P,Diffuse keratosis on palm,23.5
SK_S,Spotted keratosis on sole,66
DK_S,Diffuse keratosis on sole,52.8
CH_BRON,Dorsal keratosis,39
LIV_EN,Chronic bronchities,6
DOR,Liver enlargement,2.4
CARCI,Carcinoma,1", header=F, sep=',')
colnames(df) <- c("abbr", "derma", "prevalence") # Assign row and column names

谢谢你的努力!我非常感激你的帮助!你从发布的代码中删除了一些行吗?当我尝试运行代码时,我没有得到相同的勾号。 - Stücke
我没有发布的唯一内容是我用来读取你的数据的代码。现在已经添加了。 - arvi1000
奇怪...我得到了一个不同的轴。无论如何,非常感谢你的努力!非常感激! :) - Stücke
5
如果有人想知道如何处理包含重复水平的变量数据(即在不使用 stat="identity" 而是使用默认的计数统计方法时),可以在第一步中加入 unique() 函数。例如:df$var <- factor(df$var, levels = unique(df$var))。请注意,此方法仅适用于 R 语言。 - stragu
@stragu 如果你在新版本的R中没有使用unique(),可能会遇到问题。感谢这个提示。 - Abel Callejo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接