【问题标题】:ggplot2 geom_bar - how to keep order of data.frame [duplicate]ggplot2 geom_bar - 如何保持data.frame的顺序[重复]
【发布时间】:2016-06-30 19:20:05
【问题描述】:

我对@9​​87654324@ 中的数据顺序有疑问。

这是我的数据集:

  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 一致。

非常感谢任何帮助!

【问题讨论】:

  • 它不是随机的,它是按字母顺序排列的。请参阅此处以获取解决方案stackoverflow.com/questions/3253641/…
  • 首先感谢您的回复。如果我应用derma_table &lt;- table(df$derma) derma_levels &lt;- names(derma_table)[order(df$prevalence)] df$derma2 &lt;- factor(df$derma, levels =derma_levels) 然后绘制ggplot(data=df, aes(x=derma, y=prevalence)) + geom_bar(stat="identity") + coord_flip() 的绘图与我的问题完全相同。事实上,这些命令只会将 data.frame 更改为字母顺序,这正是我想要避免的`
  • 您正在重新调整derma2 因子,但随后使用x=derma
  • 嘿,arvi,首先感谢您的耐心等待。我不完全理解,因为如果我打开我的df df$derma 和 df$derma2 无论如何都会有完全相同的顺序。因此,如果我更改 df$ 我绘制的内容并没有什么不同。
  • 按“本地顺序”或按流行度排序的情节排序见下文

标签: r ggplot2 geom-bar


【解决方案1】:

发布为答案,因为评论线程越来越长。您必须使用与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)])

相同的绘图命令给出:


我这样读入数据:

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

【讨论】:

  • 感谢您的努力!我真的很感谢你的帮助!您是否从发布的代码中删除了一些行?当我尝试代码时,我没有得到相同的刻度线。
  • 我唯一没有发布的是我用来在您的数据中读取的代码。现已添加。
  • 奇怪...我得到了不同的轴。无论如何,非常感谢您的努力!非常感激! :)
  • 如果有人想知道如何处理变量中存在不止一次级别的数据(即,当 使用 stat = "identity" 而是使用默认计数统计时),可以在第一步添加unique()函数。例如:df$var &lt;- factor(df$var, levels = unique(df$var))
  • @stragu 如果您没有在较新版本的 R 中使用 unique(),您可能会遇到问题。感谢您的提示
猜你喜欢
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多