我刚刚得到以下情节:
想知道如何在R中完成? (或其他软件)
更新10.03.11 :感谢所有参与回答此问题的人 - 您提供了很棒的解决方案!我在a post on my blog编译了这里提供的所有解决方案(以及我在网上发布的其他一些解决方案)。
答案 0 :(得分:9)
Make.Funny.Plot或多或少地做了我认为它应该做的事情。根据自己的需要进行调整,可能会稍微优化一下,但这应该是一个不错的开始。
Make.Funny.Plot <- function(x){
unique.vals <- length(unique(x))
N <- length(x)
N.val <- min(N/20,unique.vals)
if(unique.vals>N.val){
x <- ave(x,cut(x,N.val),FUN=min)
x <- signif(x,4)
}
# construct the outline of the plot
outline <- as.vector(table(x))
outline <- outline/max(outline)
# determine some correction to make the V shape,
# based on the range
y.corr <- diff(range(x))*0.05
# Get the unique values
yval <- sort(unique(x))
plot(c(-1,1),c(min(yval),max(yval)),
type="n",xaxt="n",xlab="")
for(i in 1:length(yval)){
n <- sum(x==yval[i])
x.plot <- seq(-outline[i],outline[i],length=n)
y.plot <- yval[i]+abs(x.plot)*y.corr
points(x.plot,y.plot,pch=19,cex=0.5)
}
}
N <- 500
x <- rpois(N,4)+abs(rnorm(N))
Make.Funny.Plot(x)
编辑:纠正,以便始终有效。
答案 1 :(得分:8)
我最近遇到了the beeswarm package,这有点相似之处。
蜂群情节是一个 一维散点图如 “stripchart”,但密集, 非重叠点。
以下是一个例子:
library(beeswarm)
beeswarm(time_survival ~ event_survival, data = breast,
method = 'smile',
pch = 16, pwcol = as.numeric(ER),
xlab = '', ylab = 'Follow-up time (months)',
labels = c('Censored', 'Metastasis'))
legend('topright', legend = levels(breast$ER),
title = 'ER', pch = 16, col = 1:2)
http://www.cbs.dtu.dk/~eklund/beeswarm/beeswarm_example_03.png
答案 2 :(得分:4)
我已经提出了与Joris类似的代码,但我认为这不仅仅是一个词干情节;这里我的意思是它们在每个系列中的y值是与箱内平均值的距离的绝对值,而x值更多地是关于该值是低于还是高于平均值。
示例代码(有时会抛出警告但有效):
px<-function(x,N=40,...){
x<-sort(x);
#Cutting in bins
cut(x,N)->p;
#Calculate the means over bins
sapply(levels(p),function(i) mean(x[p==i]))->meansl;
means<-meansl[p];
#Calculate the mins over bins
sapply(levels(p),function(i) min(x[p==i]))->minl;
mins<-minl[p];
#Each dot is one value.
#X is an order of a value inside bin, moved so that the values lower than bin mean go below 0
X<-rep(0,length(x));
for(e in levels(p)) X[p==e]<-(1:sum(p==e))-1-sum((x-means)[p==e]<0);
#Y is a bin minum + absolute value of a difference between value and its bin mean
plot(X,mins+abs(x-means),pch=19,cex=0.5,...);
}
答案 3 :(得分:2)
试用vioplot包:
library(vioplot)
vioplot(rnorm(100))
(有可怕的默认颜色; - )
wvioplot包中还有wvioplot()用于加权小提琴图,beanplot用于结合小提琴和地毯图。它们也可以通过lattice包获得,请参阅?panel.violin
。
答案 4 :(得分:1)
由于尚未提及此问题,因此还有ggbeeswarm作为基于ggplot2的相对较新的R包。
为ggplot添加另一个geom而不是geom_jitter等。
特别是 geom_quasirandom (请参阅下面的第二个示例)会产生非常好的结果,实际上我已将其修改为默认情节。
值得注意的还有包vipor(R中的VIolin POints),它使用标准R图形生成绘图,实际上ggbeeswarm也在幕后使用。
set.seed(12345)
install.packages('ggbeeswarm')
library(ggplot2)
library(ggbeeswarm)
ggplot(iris,aes(Species, Sepal.Length)) + geom_beeswarm()
ggplot(iris,aes(Species, Sepal.Length)) + geom_quasirandom()
#compare to jitter
ggplot(iris,aes(Species, Sepal.Length)) + geom_jitter()