如何输出茎叶图作为图

时间:2014-10-23 16:15:17

标签: r plot

有没有办法将词根和叶子图输出到图形设备,例如window() / quartz()?在R:?stem中,在图形包中,以及?stem.leaf,在aplpack包中至少有两种获取茎和叶图的方法。两者都输出文本到控制台。例如:

> set.seed(1)
> stem(rbinom(10, size=10, prob=.5))

  The decimal point is at the |

  3 | 0
  4 | 000
  5 | 0
  6 | 00
  7 | 000

如果可以方便地将其输出到图形设备,可以将其与多图布局中的其他图(例如直方图)组合,和/或保存为png文件,那将是很好的。我知道你可以输出LaTeX并将其编译成pdf(例如,参见:Stem and Leaf from R into LaTeX),但这不是非常方便,并不是我真正想要的。是否有R功能可以做到这一点?有简单的手工编码解决方案吗?

2 个答案:

答案 0 :(得分:10)

这是一个简单的例子:

plot.new()
tmp <- capture.output(stem(iris$Petal.Length))
text( 0,1, paste(tmp, collapse='\n'), adj=c(0,1), family='mono' )

enter image description here

如果要覆盖直方图,那么您可能希望在text而不是tmp的每个元素上使用paste函数。 strheightstrwidth等函数可用于查找坐标。

gplots和plotrix软件包中还有函数用于绘制文本和将表添加到图中(其他软件包中的其他函数也可能存在于这些行中)。

答案 1 :(得分:3)

以下是等效的:

set.seed(1)
xx = rbinom(10, size=10, prob=.5)
barplot(t(table(xx)), horiz=T)

enter image description here

更为相似:

set.seed(1)
xx = rnorm(10)

xxch = as.character(xx)
ff = sapply(strsplit(xxch, '\\.'), function(x) x[1])
ss = sapply(strsplit(xxch, '\\.'), function(x) x[2])
first = sapply(strsplit(ss, ''), function(x) x[1])
second = sapply(strsplit(ss, ''), function(x) x[2])
third = sapply(strsplit(ss, ''), function(x) x[3])
dd = data.frame(ff, first, second, third)
dd = cbind(dd[1], sapply(dd[-1], as.numeric))
ddt = data.table(dd)
gg = ddt[order(ff,first)][,paste(first, collapse=""),by=ff]
gg$rr = rownames(gg)
ggplot(gg)+geom_text(aes(x=rr, y=1, label=paste(ff,'|',V1))) +
theme(axis.text = element_blank(),axis.title = element_blank(), axis.ticks=element_blank()) +
coord_flip()+ labs(title="Decimal is at |")

enter image description here

可能需要针对不同的集调整代码。

使用capture.output(由@Greg建议)并使用ggplot绘图:

tmp <- capture.output(stem(iris$Petal.Length))
stemdf = data.frame(tmp, rr=1:length(tmp))
ggplot(stemdf)+ geom_text(aes(x=rr, y=0, label=tmp), hjust=0) + 
    coord_flip()+ theme_classic() + 
    scale_x_discrete(breaks=NULL)+ 
    scale_y_discrete(breaks=NULL, limits=c(0,1))+ 
    theme(axis.text = element_blank(),
        axis.title = element_blank(), 
        axis.ticks=element_blank(), 
        panel.grid=element_blank(), 
        axis.line=element_blank())

enter image description here