有没有办法用单独的饼图制作折线图作为 R 中的标记?
Is there a way to make a Line Chart with a separate Pie Chart as a marker in R?
我正在寻找一种方法来制作包含时间轴上的值的折线图,但是,我需要将标记作为我可以通过编程生成的饼图。我正在寻找与此类似的东西:
这在 R 中是否可行?如果可行,我需要下载哪些库才能实现。
假设我有这样的数据集(在逗号分隔列表中):
我希望构建折线图,X 轴为时间,Y 轴为状态。但是,标记应该是基于数据集中的质量、成本和交付状态的不同颜色的等比例饼图。类似这样:
不确定是否存在执行此操作的程序包。但是在 plotrix
包(特别是 plotrix::getYmult()
)的一些帮助和启发下(在此处查看更多信息:https://CRAN.R-project.org/package=plotrix)它是可行的。
首先定义函数
addPies <- function(x, y=x, radius=0.1, shareVector=c(25, 25, 25, 25),
col="cbPalette"){
#setup
if (!require('plotrix')) { stop('Need package plotrix. See https://CRAN.R-project.org/package=plotrix') }
seqD <- seq(0, 2*pi, length=100)
if(any(grepl("cbPalette", col))){
#color palette from http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/
col <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
} else {
col <- col
}
#iterate over number of circles
for(j in 1:length(x)){
xcord <- x[j]
ycord <- y[j]
r <- radius[j]
if(is.list(shareVector)){
shareVec <- shareVector[[j]]
} else {
shareVec <- shareVector
}
#the way xx and yy are defined is heavily inspired by the plotrix package
xx <- cos(seqD)*r+xcord
yy <- sin(seqD)*getYmult()*r+ycord
inputPer <- cumsum(shareVec)
#initiate circle
inputPush <- 0
#iterate over number of shares
for(i in 1:length(inputPer)){
nullX <- seq(xcord,xx[(inputPush[i]):inputPer[i]][1], length=100)
nullY <- seq(ycord,yy[(inputPush[i]):inputPer[i]][1], length=100)
xpol <- c(xx[(inputPush[i]):inputPer[i]], nullX)
ypol <- c(yy[(inputPush[i]):inputPer[i]], nullY)
polygon(xpol, ypol, col=col[i], border="white", lwd=2)
inputPush[i+1] <- inputPer[i]
}
}
}
输入是:
x
是 x 坐标的数字(对于单个饼图)或向量(对于多个饼图)。 y
一样。 radius
一样。 shareVector
是一个向量(对于单个饼图)或向量列表(多个饼图),仅适用于整数并且总和应为 100,否则它将有一个空白点。
示例单个馅饼:
plot(0,0, type="n")
addPies(0)
示例多个饼图:
xVec <- c(2010, 2011, 2012, 2013)
yVec <- c(20, 50, 10, 35)
radiusVec <- c(0.15, 0.25, 0.1, 0.20)
shareList <- list(c(70, 20, 10), c(20, 50, 30), c(20, 20, 40, 10, 10), c(50, 50))
plot(y=yVec, x=xVec, type='l', xlim=c(2009.5, 2013.5), ylim=c(0, 66),
lwd=2, col="lightblue")
addPies(xVec, yVec, radiusVec, shareList)
使用 Device Size 保存图,看起来应该没问题
这是一个老问题,但要完整,您可以使用 mapplots
包中的 add.pie()
。
我正在寻找一种方法来制作包含时间轴上的值的折线图,但是,我需要将标记作为我可以通过编程生成的饼图。我正在寻找与此类似的东西:
这在 R 中是否可行?如果可行,我需要下载哪些库才能实现。
假设我有这样的数据集(在逗号分隔列表中):
我希望构建折线图,X 轴为时间,Y 轴为状态。但是,标记应该是基于数据集中的质量、成本和交付状态的不同颜色的等比例饼图。类似这样:
不确定是否存在执行此操作的程序包。但是在 plotrix
包(特别是 plotrix::getYmult()
)的一些帮助和启发下(在此处查看更多信息:https://CRAN.R-project.org/package=plotrix)它是可行的。
首先定义函数
addPies <- function(x, y=x, radius=0.1, shareVector=c(25, 25, 25, 25),
col="cbPalette"){
#setup
if (!require('plotrix')) { stop('Need package plotrix. See https://CRAN.R-project.org/package=plotrix') }
seqD <- seq(0, 2*pi, length=100)
if(any(grepl("cbPalette", col))){
#color palette from http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/
col <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
} else {
col <- col
}
#iterate over number of circles
for(j in 1:length(x)){
xcord <- x[j]
ycord <- y[j]
r <- radius[j]
if(is.list(shareVector)){
shareVec <- shareVector[[j]]
} else {
shareVec <- shareVector
}
#the way xx and yy are defined is heavily inspired by the plotrix package
xx <- cos(seqD)*r+xcord
yy <- sin(seqD)*getYmult()*r+ycord
inputPer <- cumsum(shareVec)
#initiate circle
inputPush <- 0
#iterate over number of shares
for(i in 1:length(inputPer)){
nullX <- seq(xcord,xx[(inputPush[i]):inputPer[i]][1], length=100)
nullY <- seq(ycord,yy[(inputPush[i]):inputPer[i]][1], length=100)
xpol <- c(xx[(inputPush[i]):inputPer[i]], nullX)
ypol <- c(yy[(inputPush[i]):inputPer[i]], nullY)
polygon(xpol, ypol, col=col[i], border="white", lwd=2)
inputPush[i+1] <- inputPer[i]
}
}
}
输入是:
x
是 x 坐标的数字(对于单个饼图)或向量(对于多个饼图)。 y
一样。 radius
一样。 shareVector
是一个向量(对于单个饼图)或向量列表(多个饼图),仅适用于整数并且总和应为 100,否则它将有一个空白点。
示例单个馅饼:
plot(0,0, type="n")
addPies(0)
示例多个饼图:
xVec <- c(2010, 2011, 2012, 2013)
yVec <- c(20, 50, 10, 35)
radiusVec <- c(0.15, 0.25, 0.1, 0.20)
shareList <- list(c(70, 20, 10), c(20, 50, 30), c(20, 20, 40, 10, 10), c(50, 50))
plot(y=yVec, x=xVec, type='l', xlim=c(2009.5, 2013.5), ylim=c(0, 66),
lwd=2, col="lightblue")
addPies(xVec, yVec, radiusVec, shareList)
使用 Device Size 保存图,看起来应该没问题
这是一个老问题,但要完整,您可以使用 mapplots
包中的 add.pie()
。