面对R中的饼图

时间:2016-10-07 11:11:23

标签: r ggplot2

简单的问题,但我是R的新手,所以它给了我一点惊愕。我试图在R中制作一些饼图来练习我的数据可视化技能。

我有一个如下所示的数据框:

   carrier n_cancelled n_early n_ontime n_late
     <chr>       <int>   <int>    <int>  <int>
1       9E        1044      54    12891   4471
2       AA         636      16    26965   5112
3       AS           2      12      606     94
4       B6         466     155    41661  12353
5       DL         349      36    39931   7794
6       EV        2817      66    35646  15644
7       F9           3       1      489    192
8       FL          73      16     2321    850
9       HA           0       1      317     24
10      MQ        1234      53    19790   5320
11      OO           3       0       23      6
12      UA         686      22    45762  12195
13      US         663       9    17444   2420
14      VX          31       7     4231    893
15      WN         192       0     8833   3250
16      YV          56       2      387    156

我正在寻找的是每个运营商下面的一些饼图,如下所示。

looks like this

现在我的代码看起来像这样......

status <- c("Cancelled", "Early", "On-Time", "Late")
ggplot(counts_by_carrier, aes(x = factor(1), y = c(n_cancelled, n_early, n_ontime, n_late), fill = status)) +
  geom_bar(width = 1, stat = "identity") + 
  coord_polar("y", start = 0) +
  blank_theme + 
  facet_grid(facets=. ~ carrier)

但它会返回Error: Aesthetics must be either length 1 or the same as the data (16): x, y, fill

这是错误的。我将它作为Y值输入所有值n_cancelled等的矢量,并且它不知道如何处理单个饼图。

但我如何解决它目前超出了我的范围。如何强制它一次只查看一行并为每一行打印不同的一行?

1 个答案:

答案 0 :(得分:0)

请尝试以人们可以使用的格式发布您的数据,例如:

df <- read.table(
  text = 
"   carrier n_cancelled n_early n_ontime n_late
1       9E        1044      54    12891   4471
2       AA         636      16    26965   5112
3       AS           2      12      606     94
4       B6         466     155    41661  12353
5       DL         349      36    39931   7794
6       EV        2817      66    35646  15644
7       F9           3       1      489    192
8       FL          73      16     2321    850
9       HA           0       1      317     24
10      MQ        1234      53    19790   5320
11      OO           3       0       23      6
12      UA         686      22    45762  12195
13      US         663       9    17444   2420
14      VX          31       7     4231    893
15      WN         192       0     8833   3250
16      YV          56       2      387    156"
)

正如@docendo评论的那样,您需要将数据转换为&#34; long&#34;格式,例如,使用dplyr / tidyr

这样的格式
df %>%
  gather("Outcome", "Count", - carrier)

现在只有三列 - 列标题将成为&#34;结果&#34;中的条目,值将成为计数,如下所示:

  carrier     Outcome Count
1      9E n_cancelled  1044
2      AA n_cancelled   636
3      AS n_cancelled     2
4      B6 n_cancelled   466
5      DL n_cancelled   349
6      EV n_cancelled  2817

然后,您可以将该信息传递给ggplot以制作您想要的情节(请注意,我正在删除每个组中的前导&#34; n _&#34;)

df %>%
  gather("Outcome", "Count", - carrier) %>%
  mutate(Outcome = gsub("^n_","", Outcome)) %>%
  ggplot(aes(fill = Outcome
             , y = Count
             , x = 1)) +
  geom_bar(stat = "identity"
           , position = "dodge") +
  facet_wrap(~carrier
             , scales = "free_y") +
  xlab("")

enter image description here

我会将它变成饼图(尽管你很可能很容易转换成它)。它们几乎不是一个好主意,如果您的目标是改善数据可视化,我强烈建议您不要使用饼图。