漂亮的饼图与 R
beautiful Pie Charts with R
假设我有这个简单的数据:
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))
这很简单,但可以接受。
如何使用 ggplot2 或 lattice 获得类似的东西?
经过反复试验,我得到了
ggplot(mydata, aes(x = factor(1), y=FR,fill=factor(group)) ) + geom_bar(width = 1,stat="identity")+coord_polar(theta = "y")
它更加复杂和丑陋。这不是应该很容易吗?
ggplot 书籍仅提供一些示例,不鼓励使用饼图。
格子更糟,你需要很多很多行才能让它吓人。
谁能帮我弄个漂亮又简单的饼图好吗?
例如像...
没有20行代码就可以轻松搞定的R包吗?
为什么不用 方形 饼图?
devtools::install_github("hrbrmstr/waffle")
library(waffle)
mydata <- c(`A`=20, `B`=32, `0`=32, `AB`=16)
waffle(mydata, title = "Yummy waffle pie!")
如果您有多个维度的信息,另一种选择可能是sunburstR. Using browsers
data from @rawr post您可以这样做:
library(sunburstR)
library(dplyr)
library(tidyr)
browsers %>%
unite(bv, browser, version, sep = "-") %>%
select(bv, share) %>%
sunburst(., count = TRUE)
您可以使用 treemap
(对于交互式版本,请尝试@timelyportfolio 的 d3treeR
package)
library(treemap)
tm <- treemap(
browsers,
index=c("browser", "version"),
vSize="share",
vColor="share",
type="value"
)
您也可以使用桑基图(来自 networkD3
package)
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)
您可以尝试使用 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)
这里有一些实用的提示:
来源:Dark Horse Analytics: Salvaging the Pie
(老实说,条形图有什么问题吗?)
注意:我不知道 Dark Horse Analytics 做了什么。这只是我的 go-to、anti-pie 演示图像。
经过反复试验,我认为 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 中的原始图片是交互式的。
假设我有这个简单的数据:
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))
这很简单,但可以接受。
如何使用 ggplot2 或 lattice 获得类似的东西?
经过反复试验,我得到了
ggplot(mydata, aes(x = factor(1), y=FR,fill=factor(group)) ) + geom_bar(width = 1,stat="identity")+coord_polar(theta = "y")
它更加复杂和丑陋。这不是应该很容易吗? ggplot 书籍仅提供一些示例,不鼓励使用饼图。
格子更糟,你需要很多很多行才能让它吓人。
谁能帮我弄个漂亮又简单的饼图好吗? 例如像...
没有20行代码就可以轻松搞定的R包吗?
为什么不用 方形 饼图?
devtools::install_github("hrbrmstr/waffle")
library(waffle)
mydata <- c(`A`=20, `B`=32, `0`=32, `AB`=16)
waffle(mydata, title = "Yummy waffle pie!")
如果您有多个维度的信息,另一种选择可能是sunburstR. Using browsers
data from @rawr post您可以这样做:
library(sunburstR)
library(dplyr)
library(tidyr)
browsers %>%
unite(bv, browser, version, sep = "-") %>%
select(bv, share) %>%
sunburst(., count = TRUE)
您可以使用 treemap
(对于交互式版本,请尝试@timelyportfolio 的 d3treeR
package)
library(treemap)
tm <- treemap(
browsers,
index=c("browser", "version"),
vSize="share",
vColor="share",
type="value"
)
您也可以使用桑基图(来自 networkD3
package)
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)
您可以尝试使用 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)
这里有一些实用的提示:
来源:Dark Horse Analytics: Salvaging the Pie
(老实说,条形图有什么问题吗?)
注意:我不知道 Dark Horse Analytics 做了什么。这只是我的 go-to、anti-pie 演示图像。
经过反复试验,我认为 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 中的原始图片是交互式的。