在R中使用自定义字体

时间:2013-09-09 11:28:36

标签: r plot ggplot2

我正在尝试使用这些点在R中制作散点图:

"Cleveland points

(据我所知,W。克利夫兰建议分别使用稀疏和密集的散点图 - 我现在将它们称为“克利夫兰点”。)

底行应该是直截了当的,顶行可以通过做一些智能的过度绘图来实现(即在彼此的顶部绘制两个符号)。但是在绘制图例时这还不够。

作为一种解决方案,我因此想象得到一个包含这10个符号的字体,并指示R在绘制点+图例时使用此字体。 (现在我发现,我可能只使用text和自定义字体来绘制点。但这并不能解决图例问题。)

我还考虑过使用ggplot2,但这可能最容易通过比例实现?

问题:有关如何使用这些符号(最好是最上一行)的任何建议,也可以在图例中使用?

1 个答案:

答案 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将符号放置在图例的左边缘和文本开头之间的点处。