【问题标题】:Only displaying top 3 bars in a ggplot2 chart仅显示 ggplot2 图表中的前 3 个条形图
【发布时间】:2014-04-15 21:46:39
【问题描述】:

我正在尝试找出一种仅显示数据集前三个条形的方法。为了简单起见,我使用菱形数据集来说明我想做的事情。首先,我按从大到小排序。

library(data.table)
diamonds <- data.table(diamonds)
diamonds1 <- within(diamonds, cut <- factor(cut, levels=names(sort(table(cut), decreasing=TRUE))))

然后,我策划了。

ggplot(diamonds1, aes(cut, fill=cut)) + geom_bar(position="dodge") + guides(fill=FALSE) + ylab("Count") + xlab("Cut")

我得到了这个:

但我不想看到所有的条形图,我只想看到前三个。此外,我希望这是可重复的,因此如果数据集发生变化并且前三名不同,我可以使用相同的代码来创建正确的前三名。有没有办法做到这一点?

【问题讨论】:

  • 我正在使用 data.table 进行所有数据操作,因此如果在绘图之前必须在数据中完成解决方案,我更喜欢使用 data.table。因此,标签。

标签: r ggplot2 subset


【解决方案1】:

当然,您可以定义xlim()。添加:

+ xlim('Ideal', 'Premium', 'Very Good')
在@Arun cmets 之后

编辑:更直接的方法是在将数据提供给ggplot() 之前对数据进行子集化。您可以使用data.table 的功能来加快速度

setkey(diamonds, cut)  ## needed for fast subsetting and grouping
tt <- diamonds[, list(count=.N), by=cut]  ## same as table(diamonds$cut) but faster    
cut.values <- tt[order(count), cut][1:3]  ## select top 3 cut values by count
ggplot(diamonds[J(cut.values)], ...       ## run the same plot commands on subset of data

【讨论】:

  • 我在原始帖子中添加了一条注释,但我正在寻找一种方法来实现它,以便将来可以自动化它。我不能保证 Ideal、Premium 和 Very Good 始终是前三名,因此我希望有一个解决方案始终让我获得前三名。
  • 我猜你想要按频率排名前 3 位(最高的 3 个条形图)。在这种情况下,您可以使用names(sort(table(cut), decreasing=TRUE)[1:3]) 提取它们
  • 当我这样做时,它也会给我一个条,说不适用。关于从那里去哪里有什么建议吗?
  • names(sort(table(cut), decreasing=TRUE)[1:3]) 返回什么?不知道为什么会返回 NA。
  • @Arun 感谢您的提示。我很好地掌握了这些功能。我的意思是为什么他们会在这种情况下退回它。如果有超过 3 个级别,这应该完全返回 OP 正在寻找的内容。为了确定,我用模拟数据对其进行了测试。
猜你喜欢
  • 2022-08-12
  • 1970-01-01
  • 2020-01-02
  • 2015-12-28
  • 2018-10-03
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多