0

下面的代码通过 AlertTypeId 生成一个饼图。但是,AlertTypeId 太多了,我想将饼图中的切片数量限制为 X 最频繁的警报,其余的进入“其他”类别。我怎么能用ggplot2做到这一点?

a = c(0, 0, 0, 1, 2, 3, 3, 3)
b = c(1, 1, 0, 0, 1, 1, 1, 1)
c = c(1, 4, 2, 2, 2, 1, 1, 3)
sa2 = data.frame(WeekOfYear = a, UrgentState = b, AlertTypeId = c, IsUrgent = b)

ggplot(sa2, aes(x = factor(1), fill = factor(AlertTypeId))) + 
  geom_bar(width = 1) + 
  coord_polar(theta = "y")
4

1 回答 1

2

有很多方法可以解决它,但基本的想法是你需要

  1. 确定您要选择的 AlertId。这涉及计算每个 id 的行数。
  2. 发送到ggplot仅包含您要绘制的那些行的 data.frame(或 data.table)。

这是一个使用示例data.table

编辑:我把它分成多行以便更容易理解

library(data.table)
sa2.DT <- data.table(sa2, key="AlertTypeId")

# we can count the rows per id, by taking the length of any other column
ATid.Counts <-  sa2.DT[, list(AT.count=length(UrgentState)), by=AlertTypeId]

# then order Id's by their counts.  We will then take the `head( )` 
#    of this vector to identify the group being kept  
ATid.Ordered <- ATid.Counts[order(AT.count, decreasing=TRUE), AlertTypeId]

ATid.Ordered是按频率计数排序的 Id 列表。
服用head(ATid.Ordered, n) 将给其中的n许多人。
由于我们已将键设置sa2.DT为这些 Id,因此我们可以使用有序列表(或其中的一部分)来子集data.table

# select only those rows which have an AlertTypeId in the top n many
dat <- sa2.DT[.(head(ATid.Ordered, n=3)) ]  # <~~ note the dot in `.( )` 

dat是我们将使用的data.table(或)data.frameggplot

# use that selection to plot
ggplot(dat, aes(x = factor(1), fill = factor(AlertTypeId))) + 
  geom_bar(width = 1) + 
  coord_polar(theta = "y")

饼形图

于 2013-04-20T15:10:10.537 回答