你们中的一些人可能已经看过我关于这个主题的博客文章,在我想要帮助一个朋友在图表上生成半满的圆圈之后我编写了以下代码:
TestUnicode <- function(start="25a0", end="25ff", ...)
{
nstart <- as.hexmode(start)
nend <- as.hexmode(end)
r <- nstart:nend
s <- ceiling(sqrt(length(r)))
par(pty="s")
plot(c(-1,(s)), c(-1,(s)), type="n", xlab="", ylab="",
xaxs="i", yaxs="i")
grid(s+1, s+1, lty=1)
for(i in seq(r)) {
try(points(i%%s, i%/%s, pch=-1*r[i],...))
}
}
TestUnicode(9500,9900)
Run Code Online (Sandbox Code Playgroud)
这是有效的(即产生一个几乎完整的酷dingbatty符号网格):
它没有不同程度(即产生部分或完全填充点或空矩形的网格),无论是静默还是警告:
例如,尝试所有可用的PDF字体系列:
flist <- c("AvantGarde", "Bookman","Courier", "Helvetica", "Helvetica-Narrow",
"NewCenturySchoolbook", "Palatino", "Times","URWGothic",
"URWBookman", "NimbusMon", "NimbusSan", "NimbusSanCond",
"CenturySch", "URWPalladio","NimbusRom")
for (f in flist) {
fn <- paste("utest_",f,".pdf",sep="")
pdf(fn,family=f)
TestUnicode()
title(main=f) …
Run Code Online (Sandbox Code Playgroud) 在非标准字符集[俄语]中,我很难让ggplot正确显示轴标签.当使用这样的字符串时,ggplot标记轴,例如
\ U + 0441 U + 043D U + 0433
当我将名称保存为单独的变量并将其作为标签使用时,Ggplot会正确编码 geom_text()
转换数据帧的格式也没有多大帮助:
db$variable=sapply(db$variable,function(row) iconv(row,to='UTF-8'))
导致加扰字符,可能是因为数据已在数据帧中编码为UTF-8
我可以通过使用自定义轴来完成这项工作,scale_x_discrete( labels=names)
但这有点笨拙,特别是当数据缺少值时.有没有办法让ggplot首先正确显示这些字符?
编辑
看起来有点头疼
Sys.setlocale("LC_CTYPE","russian")
Run Code Online (Sandbox Code Playgroud)
将解决问题.我仍然不明白为什么R/ggplot在什么情况下会接受UTF8代码是不一致的.在上面的示例中,问题仅限于轴标签.这是因为对于轴标签而言,字符串是从数据表中提取的,如果相同的行存储在字符串或矩阵中,它会以某种方式处理不同的编码?
是否有一个很好的做法是在ggplot标题中插入unicode字符并将其另存为pdf?
我正在努力表达,粘贴和sprintf以获得一个不错的标题......
那么,有效的是
ggtitle(expression(paste('5', mu, 'g')))
Run Code Online (Sandbox Code Playgroud)
这将打印出一个丑陋的希腊mu.丑陋我的意思是不同的字体,但总体而言,它将以pdf格式打印而不会出现问题.但问题就出现了,如果你想在标题中添加新行.或许我没有找到解决方案.
我的首选解决方案是使用带有unicode编号的sprintf,例如
ggtitle(sprintf('5\u03BCg'))
Run Code Online (Sandbox Code Playgroud)
它在屏幕上显示了一个很好的结果,但不能用ggsave保存为pdf.PNG工作正常,但我想使用pdf保存选项.
是否有可能用ggsave绘制unicode字符?我读到了关于cairo_pdf设备,但这会弄乱字体,我无法正确保存图表.
在此先感谢您的帮助.
编辑: 示例PDF
我刚刚上传了一个示例PDF ...所以也许我的问题出在其他地方......
我正在尝试使用标签上的一半(以及四分之一填充)方块生成ggplot2图形,但Mac上的ggplot2似乎不支持某些符号.
例如,当我输入:
print("\u25E9")
Run Code Online (Sandbox Code Playgroud)
它显示了一个半黑的正方形,但是当我尝试在ggplot中使用它时它不会打印.我正在使用facet_wrap,但看起来问题是在ggplot中无法识别Unicode符号.
我将这个非常有用的例子用于说明:
junk<-data.frame(gug=c(
rep( paste("\u25E9"), 10),
rep( paste("\u25E8"), 10)
)
)
junk$eks<-1:nrow(junk)
junk$why<-with(junk, as.numeric(gug) + eks)
print(summary(junk))
library(ggplot2)
print(
ggplot(data=junk, mapping=aes(x=eks, y=why)) +
geom_point() +
facet_wrap(~ gug)
)
Run Code Online (Sandbox Code Playgroud)
我已经尝试将unicode放入表达式并使用plotmath,但我的笔记本电脑似乎并不支持这个特定的unicode符号,正如warinig在plotmath帮助页面上所说:
"在UTF-8语言环境中,可以输入任何Unicode字符,可能是\ uxxxx或\ Uxxxxxxxx转义序列,但问题是图形设备是否能够显示字符.最广泛的字符可能是可用的在使用cairo的X11设备中:请参阅其帮助页面,了解如何安装其他字体可以提供帮助.这通常可用于以粗体或斜体显示希腊字母.在非UTF-8语言环境中,通常不支持不在当前编码所针对的语言."
我认为这个问题基本上是在这篇文章中描述的,但在pdf中指定cairo_pdf和quartz不起作用,因为我甚至无法在插图中看到输出.
所以我想知道是否有办法从头开始创建这个标签呢?任何人都可以告诉我如何做到这一点或在哪里找到一个好的例子?
非常感谢你的帮助!
我正在使用Mac,这是SessionInfo:
> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_GB.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] Unicode_0.1-3 ggplot2_0.9.3.1 plyr_1.8 reshape2_1.2.2
loaded via a namespace …
Run Code Online (Sandbox Code Playgroud) 我希望在我的绘图中出现Unicode字符,作为混合字符串的一部分,例如?=0.84
将0.84保存在变量中,比方说cor.value
.
这实际上排除了诸如expression
或bquote
(这里建议)的解决方案.我不知道它们是否会单独工作,但试图将它们与变量值相结合paste
是一个问题.我能让它工作的唯一方法是在我的源代码中实际使用unicode符号.它甚至出现在R Studio的情节中.
但是当我试图打印时,我只是..
改为.到目前为止,我发现的唯一建议是使用开罗,但开罗正在破坏我的剩余情节,所以我想坚持使用原始的pdf设备.
有没有机会,通过使用Unicode或其他东西,在字幕中打印字符串,但不必使用开罗?
这是开罗所做的一个例子(这应该是图的一角,带有灰色边框):
部分点被切断,没有被剪裁.因此,当它与边框重叠时,边框略微偏移,并且点"透过"边框(此处您只在底部看到它,在其他地方它更明显).底部和右侧边框比左边和上边框更粗.点背后非常浅灰色的带子在开罗更为宽广.标准PDF设备中不存在这些问题.
我目前正在研究Fedora 21系统,但是这个文档也必须在Windows 8或10上编译,最好也在其他Linux版本上编译.
这是绘图的代码(打算以小尺寸观看,大约2x1.5英寸).当前的计划是将文本放在c.a
变量中并将其放在轴标签所在的位置,但我希望保持我的选项打开以使其成为后面的注释:
offset.plotdata <- data.frame(understandability=c(2.95, 0.85, 0.75, 1.15, 2.25, 2.05, 1.95, 2.15, 2.25, 0.75, 2.05, 0.85), lowercase.pseudonym=c("A", "B", "C", "D", "E", "F", "A", "D", "E", "C", "F", "B"), questionnaire=c(rep("pre", 6), rep("post", 6)))
offset.plotdata$decorative.points <- c(1,2,3,4,5,NA,1,2,3,4,5,NA)
middle.blue <- "#2186D9"
variable.name <- "understandability"
cor.value <- 0.84
c.a <- "rho = 0.84"
ggplot(offset.plotdata,
aes_string(x="questionnaire", y=variable.name,
group="lowercase.pseudonym"))+ …
Run Code Online (Sandbox Code Playgroud)