到目前为止,我一直无法找到一个可以创建像John Stasko那样的旭日阴谋的R库。任何人都知道如何在R或Python中实现它?
答案 0 :(得分:30)
您甚至可以使用R现在轻松构建交互式版本:
# devtools::install_github("timelyportfolio/sunburstR")
library(sunburstR)
# read in sample visit-sequences.csv data provided in source
# https://gist.github.com/kerryrodden/7090426#file-visit-sequences-csv
sequences <- read.csv(
system.file("examples/visit-sequences.csv",package="sunburstR")
,header=F
,stringsAsFactors = FALSE
)
sunburst(sequences)
...当你将鼠标移到它上面时,神奇就会发生:
修改强>
这个软件包的官方网站可以在这里找到(有很多例子!):https://github.com/timelyportfolio/sunburstR
帽子提示@timelyportfolio谁创造了这段令人印象深刻的代码!
答案 1 :(得分:29)
使用极坐标投影中的matplotlib条形图的旭日形图的Python版本:
data = [
('/', 100, [
('home', 70, [
('Images', 40, []),
('Videos', 20, []),
('Documents', 5, []),
]),
('usr', 15, [
('src', 6, [
('linux-headers', 4, []),
('virtualbox', 1, []),
]),
('lib', 4, []),
('share', 2, []),
('bin', 1, []),
('local', 1, []),
('include', 1, []),
]),
]),
]
sunburst(data)
示例,如何使用此功能:
devtools::install_github("joshuaulrich/xts")
答案 2 :(得分:12)
您可以使用geom_tile
包中的ggplot2
在旭日情节的线条上创建一些内容。我们先创建一些随机数据:
require(ggplot2); theme_set(theme_bw())
require(plyr)
dat = data.frame(expand.grid(x = 1:10, y = 1:10),
z = sample(LETTERS[1:3], size = 100, replace = TRUE))
然后创建栅格图。此处,图中的x
轴与x
中的dat
变量,y
轴上的y
变量以及z
变量的填充相关联。 p = ggplot(dat, aes(x = x, y = y, fill = z)) + geom_tile()
print(p)
变量的像素。这产生了以下图:
ggplot2
p + coord_polar()
包支持所有类型的坐标转换,其中一个采用一个轴并将其投影到一个圆上,即极坐标:
dat
这大致可以满足您的需求,现在您可以通过调整{{1}}来获得所需的结果。
答案 3 :(得分:5)
Theres一个名为ggsunburst
的包。遗憾的是,不在CRAN中,但您可以按照网站上的说明进行安装:http://genome.crg.es/~didac/ggsunburst/ggsunburst.html。
希望对那些仍在寻找这样的好包装的人有所帮助。
此致
答案 4 :(得分:3)
我所知道的只有几个库可以原生这样做:
这些都不是Python或R,但是获得一个python / R脚本来写出一个可以由任何一个javascript库加载的简单JSON文件应该是非常容易实现的。
答案 5 :(得分:3)
这里有一层ggplot2
sunburst,有两层。
基本思想是为每个图层创建一个不同的条形图,并使外部图层的条形图更宽。我也与x轴混淆,以确保内部饼图中间没有洞。因此,您可以通过更改宽度和x轴值来控制旭日形的外观。
library(ggplot2)
# make some fake data
df <- data.frame(
'level1'=c('a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c'),
'level2'=c('a1', 'a2', 'a3', 'a4', 'b1', 'b2', 'c1', 'c2', 'c3'),
'value'=c(.025, .05, .027, .005, .012, .014, .1, .03, .18))
# sunburst plot
ggplot(df, aes(y=value)) +
geom_bar(aes(fill=level1, x=0), width=.5, stat='identity') +
geom_bar(aes(fill=level2, x=.25), width=.25, stat='identity') +
coord_polar(theta='y')
与森伯斯特专用软件相比,它唯一的缺点是它假设你希望外层是集体穷举的(即没有间隙)。 &#34;部分详尽无遗&#34;外层(就像其他一些例子中)肯定是可能的,但更复杂。
为了完整性,这里使用更好的格式和标签进行清理:
library(data.table)
# compute cumulative sum for outer labels
df <- data.table(df)
df[, cumulative:=cumsum(value)-(value/2)]
# store labels for inner circle
inner_df <- df[, c('level1', 'value'), with=FALSE]
inner_df[, level1_value:=sum(value), by='level1']
inner_df <- unique(text_df[, c('level1', 'level1_value'), with=FALSE])
inner_df[, cumulative:=cumsum(level1_value)]
inner_df[, prev:=shift(cumulative)]
inner_df[is.na(prev), position:=(level1_value/2)]
inner_df[!is.na(prev), position:=(level1_value/2)+prev]
colors <- c('#6a3d9a', '#1F78B4', '#33A02C', '#3F146D', '#56238D', '#855CB1', '#AD8CD0', '#08619A', '#3F8DC0', '#076302', '#1B8416', '#50B74B')
colorNames <- c(unique(as.character(df$level1)), unique(as.character(df$level2)))
names(colors) <- colorNames
ggplot(df, aes(y=value, x='')) +
geom_bar(aes(fill=level2, x=.25), width=.25, stat='identity') +
geom_bar(aes(fill=level1, x=0), width=.5, stat='identity') +
geom_text(data=inner_df, aes(label=level1, x=.05, y=position)) +
coord_polar(theta='y') +
scale_fill_manual('', values=colors) +
theme_minimal() +
guides(fill=guide_legend(ncol=1)) +
labs(title='') +
scale_x_continuous(breaks=NULL) +
scale_y_continuous(breaks=df$cumulative, labels=df$level2, 5) +
theme(axis.title.x=element_blank(), axis.title.y=element_blank(), panel.border=element_blank(), panel.grid=element_blank())
答案 6 :(得分:2)
由于jbkunst提到了ggsunburst,在这里我发布了一个用sirex复制sunburst的例子。
它不完全相同,因为在ggsunburst中,节点的角度等于其子节点的角度之和。
builder.setPositiveButton(mContent.getString(R.string.BtnYes)) { dialog, which ->
val handler = Handler()
handler.postDelayed({ mActivity.finish() }, 300)
}
答案 7 :(得分:1)
library(datasets)
library(data.table)
library(plotly)
as.sunburstDF <- function(DF, valueCol = NULL){
require(data.table)
colNamesDF <- names(DF)
if(is.data.table(DF)){
DT <- copy(DF)
} else {
DT <- data.table(DF, stringsAsFactors = FALSE)
}
DT[, root := names(DF)[1]]
colNamesDT <- names(DT)
if(is.null(valueCol)){
setcolorder(DT, c("root", colNamesDF))
} else {
setnames(DT, valueCol, "values", skip_absent=TRUE)
setcolorder(DT, c("root", setdiff(colNamesDF, valueCol), "values"))
}
hierarchyCols <- setdiff(colNamesDT, "values")
hierarchyList <- list()
for(i in seq_along(hierarchyCols)){
currentCols <- colNamesDT[1:i]
if(is.null(valueCol)){
currentDT <- unique(DT[, ..currentCols][, values := .N, by = currentCols], by = currentCols)
} else {
currentDT <- DT[, lapply(.SD, sum, na.rm = TRUE), by=currentCols, .SDcols = "values"]
}
setnames(currentDT, length(currentCols), "labels")
hierarchyList[[i]] <- currentDT
}
hierarchyDT <- rbindlist(hierarchyList, use.names = TRUE, fill = TRUE)
parentCols <- setdiff(names(hierarchyDT), c("labels", "values", valueCol))
hierarchyDT[, parents := apply(.SD, 1, function(x){fifelse(all(is.na(x)), yes = NA_character_, no = paste(x[!is.na(x)], sep = ":", collapse = " - "))}), .SDcols = parentCols]
hierarchyDT[, ids := apply(.SD, 1, function(x){paste(x[!is.na(x)], collapse = " - ")}), .SDcols = c("parents", "labels")]
hierarchyDT[, c(parentCols) := NULL]
return(hierarchyDT)
}
DF <- as.data.table(Titanic)
setcolorder(DF, c("Survived", "Class", "Sex", "Age", "N"))
sunburstDF <- as.sunburstDF(DF, valueCol = "N")
# Sunburst
plot_ly(data = sunburstDF, ids = ~ids, labels= ~labels, parents = ~parents, values= ~values, type='sunburst', branchvalues = 'total')
# Treemap
# plot_ly(data = sunburstDF, ids = ~ids, labels= ~labels, parents = ~parents, values= ~values, type='treemap', branchvalues = 'total')
可以找到其他一些here信息。