优美的饼图之R语言实现

18

假设我有这个简单的数据:

 mydata <- data.frame(group=c("A", "B", "0", "AB"), FR=c(20, 32, 32, 16))

如果我想从这个数据框创建一个饼图,我可以这样做:

 with(mydata,pie(FR, labels=paste0(as.character(group), " ", FR, "%"), radius=1))

basic pie

这个图很简单但是可以接受。

我该如何使用ggplot2或lattice得到类似的图形呢?

经过多次尝试,我得到了:

ggplot(mydata, aes(x = factor(1), y=FR,fill=factor(group)) ) + geom_bar(width = 1,stat="identity")+coord_polar(theta = "y") 

ggplot

这太复杂丑陋了。它不应该很简单吗? ggplot书只提供了一些示例,并且不建议使用饼图。

Lattice甚至更糟,需要许多行才能得到它的魅力。

有没有人能帮我获得一个漂亮简单的饼图呢? 例如像这样的...

example1

example2

难道没有任何R包能够轻松做到这一点,而不需要20行代码吗?


5
"rawrs code" 使用基础 R 生成了一个漂亮的图表:https://dev59.com/u18d5IYBdhLWcg3wgiX4#26749522 - 或许可以提供一些提示(但很可能需要超过20行代码)。 - user20650
6
ggplot的饼图怎么“丑”了?如果您告诉我们缺少或需要更改什么,那么帮助您就更容易了。请注意,我的翻译目标是使原文的意思尽可能保持不变并尽量让其更加通俗易懂。 - scoa
5
@skan,请你务必仔细查阅免费提供的海量信息,这些信息可以帮助你理解为何你认为“漂亮”的底部两个饼图(我猜你是这么认为的)实际上相当糟糕,并且在确保你所期望的结果方面效果不佳。我感激Steven包含华夫饼图,但一个干净利落的条形图也能很好地呈现你最初的饼图数据。 - hrbrmstr
4
大多数 R 可视化库没有内置饼图支持,这并非无因无故。因为饼图可能是可视化分类数据(或任何数据)最糟糕的方式。一个简单的谷歌搜索可以找到许多反对饼图的论点。 - user507484
4
有很多人不喜欢用饼图。即使他们是对的,你也没有问:“为什么我不能使用饼图?”Lattice没有饼图,可能是出于同样的原因,但它的作者Deepayan Sarkar包含了生成饼图的代码(在他的书的最后三页上 - 这就是他认为这个主题有多重要的原因)。Sarkar慷慨地将书中的代码放在网上,饼图代码在这里。现在,无论是好还是坏,你都可以制作漂亮的Lattice饼图。 - Mars
显示剩余4条评论
6个回答

46
为什么不用一个 正方形 饼图?
devtools::install_github("hrbrmstr/waffle")
library(waffle)

mydata <- c(`A`=20, `B`=32, `0`=32, `AB`=16)
waffle(mydata, title = "Yummy waffle pie!")

enter image description here


如果您有多个信息维度,另一个选择可能是 sunburstR。使用 @rawr post 提供的 browsers 数据,您可以执行以下操作:
library(sunburstR)
library(dplyr)
library(tidyr)
browsers %>%
  unite(bv, browser, version, sep = "-") %>%
  select(bv, share) %>%
  sunburst(., count = TRUE)

enter image description here

您可以使用 treemap(如果需要交互式版本,请尝试 @timelyportfolio 的 d3treeR package

library(treemap)
tm <- treemap(
  browsers,
  index=c("browser", "version"),
  vSize="share",
  vColor="share",
  type="value"
)

enter image description here

您也可以使用桑基图(来自networkD3)。

library(networkD3)
df <- browsers %>%
  mutate_each(funs(as.character), browser, version) %>%
  mutate(bn = group_indices_(., .dots = "browser"), 
         cn = max(bn) + row_number()) 

links <- select(df, bn, cn, share)
nodes <- data.frame(name = c("", sort(unique(df$browser)), df$version))

sankeyNetwork(Links = links, Nodes = nodes, Source = "bn",
              Target = "cn", Value = "share", NodeID = "name",
              fontSize = 12, nodeWidth = 30)

enter image description here


3
两个情节都很棒 @Steven Beaupre - Marcin

43

以下是一些方便的提示:

来源: Dark Horse Analytics: 挽救饼图

(真的,为什么不能用条形图呢?)

注意: 我不知道Dark Horse Analytics做什么。这只是我常用的反饼图演示图片。


15

您可以尝试使用 plotrix 包中的 pie3D() 函数:

library(plotrix)
pie3D(mydata$FR, labels = mydata$group, main = "An exploded 3D pie chart", explode=0.1, radius=.9, labelcex = 1.2,  start=0.7)

在此输入图像描述


14
要是有一些C4炸药可以真正地炸掉饼图就好了 :-) - hrbrmstr
2
你能解释一下什么是C4吗? - skan
好的,我以为你在谈论某个包或方法。 - skan

5

经过多次试错,我决定使用plotly:

library(plotly)
mydata <- data.frame(group=c("A", "B", "0", "AB"), FR=c(20, 32, 32, 16))

q <- plot_ly(mydata, labels = ~group, values = ~FR, type = 'pie') %>%
  layout(title = "Title",          
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))
q

这是一张PNG图片,在Rstudio中,当你将鼠标悬停在图片上时,它是交互式的。

Plotly示例


1
我也同意Plotly更加直观易懂。 - testing_22

3

是的,我创建了ggpie用于更好地创建饼图(2D和3D)、甜甜圈图和玫瑰饼图!

这是Vignette


2

rAmCharts4 包对 3D 饼图有很好的支持。

library(rAmCharts4)

dat <- data.frame(
  group = c("A", "B", "0", "AB"),
  FR = c(20, 32, 32, 16)
)

amPieChart(
  data = dat,
  category = "group",
  value    = "FR",
  threeD = TRUE,
  variableDepth = TRUE
)

enter image description here


这个其实不是很重要,但你能否把数据编辑一下,让血型变成O型而不是0型(字母“O”,不是数字0)...??? - Ben Bolker
@BenBolker 额,抱歉。典型的错误。就如你所说,这没关系;-) - Stéphane Laurent
仅为了公正起见,无论是Ben还是Stéphane,都使用O和0,这取决于国家。享受吧! - tjebo

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