2015-02-26 2 views
6

больше кода, чем вам действительно нужно, но установить настроение:ggsave потери Юникода Charaters из ggplot + gridExtra

#Make some data and load packages 
data<-data.frame(pchange=runif(80,0,1),group=factor(sample(c(1,2,3),80,replace=T))) 
library(dplyr) 
library(magrittr) 
library(gridExtra) 
library(ggplot2) 
data%<>%arrange(group,pchange) %>% mutate(num=1:80) 

#Make plot that includes unicode characters 
g1<-ggplot(data, aes(factor(num),pchange, fill = group,width=.4)) + 
    geom_bar(stat="identity", position = "dodge") + 
    theme_classic()+ 
    theme(axis.ticks = element_blank(), 
     axis.text.x = element_blank(), 
     legend.position="right")+ 
    scale_y_continuous(breaks=c(0,.25,.5,.75,1))+ 
    xlab("")+ 
    scale_fill_discrete("Arbitrary Group", 
         breaks=c(1,2,3), 
         labels=c("< 1 Year", "\u2265 1 Year & \n\u2264 5 Years","> 5 Years")) 


#I want to add an A below the plot (this may not be necessary for the issue, but its a part of the workflow so I thought I'd include it. 
g <- arrangeGrob(plot=g1, 
       sub = textGrob("A", 
           x = .1, 
           hjust = .5, 
           vjust=-2, 
           gp = gpar(fontface = "bold", 
              fontsize = 16, 
              col="black"))) 

#Save the plot 
ggsave(filename="X:/yourpath/Plot1.pdf", plot=g, 
     width = 8, height = 4, units = "in", dpi = 600) 

Вот как это выглядит: Actual Plot

Вот что она должна выглядеть (в зависимости от символов в ключе; график, взятый как jpeg непосредственно из окна графика Rstudio): Ideal Plot

ответ

7

У вас есть два варианта. Во-первых, использовать cairo_pdf устройство вместо стандартного pdf в вызове вас ggsave, например,

library(Cairo) 
ggsave(filename="X:/yourpath/Plot1.pdf", plot=g, device=cairo_pdf, 
     width = 8, height = 4, units = "in", dpi = 600) 

Другой вариант должен был бы использовать выражения вместо явных символов Юникода:

g<-ggplot(data, aes(factor(num),pchange, fill = group,width=.4)) + 
    geom_bar(stat="identity", position = "dodge") + 
    theme_classic()+ 
    theme(axis.ticks = element_blank(), 
     axis.text.x = element_blank(), 
     legend.position="right")+ 
    scale_y_continuous(breaks=c(0,.25,.5,.75,1))+ 
    xlab("")+ 
    scale_fill_discrete("Arbitrary Group", 
         breaks=c(1,2,3), 
         labels=c(expression(phantom(0) < "1 Year"), 
           expression(paste(phantom(0) >= "1 Year &", phantom(0) <= "5 Years")), 
           expression(phantom(0) > "5 Years"))) 



ggsave(filename="Plot1.pdf", plot=g, 
     width = 8, height = 4, units = "in", dpi = 600) 

Хотя, как вы можете видеть, со вторым вариантом форматирование не так сильно, как вам может понравиться.

Относительно того, почему вы столкнулись с этой проблемой, в соответствии с ответом here драйвер pdf может обрабатывать только однобайтовые кодировки.

enter image description here

+0

Я не в состоянии 'ggsave()' для работы с 'DEVICE = cairo_pdf'. Я получаю сообщение об ошибке: 'Ошибка в grid.newpage(): Ошибка ошибки cairo при записи в выходной поток'' Любые предложения? –

+0

Вы можете попробовать с помощью 'CairoPDF' из пакета ** Cairo **? –

+0

1) Либо. Я получал ошибку с объектом g или g1. 2) Кроме того, из поиска [быстрый] (http://www.r-bloggers.com/using-cairographics-with-ggsave/) кажется, что Cairo создает растровое изображение вместо векторного вывода. Если это так, то я предпочитаю оставаться в векторном формате. Таким образом, я буду использовать 'выражения', хотя я не могу найти хороший способ потянуть второй ярлык на две строки, как и раньше. –

Смежные вопросы