我正在尝试使用这些点在R中制作散点图:
(据我所知,W。克利夫兰建议分别使用稀疏和密集的散点图 - 我现在将它们称为“克利夫兰点”。)
底行应该是直截了当的,顶行可以通过做一些智能的过度绘图来实现(即在彼此的顶部绘制两个符号)。但是在绘制图例时这还不够。
作为一种解决方案,我因此想象得到一个包含这10个符号的字体,并指示R在绘制点+图例时使用此字体。
(现在我发现,我可能只使用text
和自定义字体来绘制点。但这并不能解决图例问题。)
我还考虑过使用ggplot2,但这可能最容易通过比例实现?
问题:有关如何使用这些符号(最好是最上一行)的任何建议,也可以在图例中使用?
答案 0 :(得分:1)
这是使用基本图形和TeachingDemos包中的my.symbols
函数的一种方法:
library(TeachingDemos)
ms.Cleveland <- function(num.pt = 1, cex=2, ...) {
funs <- list(
open = function(cex, ...)
points(0,0, pch=1, lwd=2, cex=cex, ...),
filled = function(cex, ...)
points(0,0, pch=16, cex=cex, ...),
half = function(cex, ...)
points(0,0, pch=1, lwd=5, cex=cex, ...),
vert = function(cex, ...) {
points(0,0, pch=1, lwd=2, cex=cex, ...)
points(0,0, pch='|', lwd=2, cex=cex/2, ...)
},
dot = function(....) {
points(0,0, pch=1, lwd=2, cex=cex, ...)
points(0,0, pch=16, cex=cex/3, ...)
}
)
funs[[num.pt]](cex, ...)
}
### create size variable for mtcars
sz <- findInterval( mtcars$wt, quantile( mtcars$wt, c(0.2, 0.4, 0.6, 0.8) ) ) + 1
with(mtcars, my.symbols(wt, mpg, ms.Cleveland, num.pt=sz, add=FALSE,
symb.plots=TRUE))
tmp <- legend('topright', pch=1, col=NA, pt.cex=2,
legend=c('Small', 'SMed', 'Medium', 'LMed', 'Large'))
my.symbols( (tmp$rect$left + tmp$text$x)/2, tmp$text$y, ms.Cleveland, num.pt=1:5,
symb.plots=TRUE)
ms.Cleveland
函数根据数字(1到5)或名称绘制点,并使用过去2点的过度绘图(可能想稍微调整一下这些函数)。
然后使用常规图例函数绘制图例,但使用col=NA
符号的位置,但不绘制它们。然后再次使用my.symbols
将符号放置在图例的左边缘和文本开头之间的点处。