Не удается увеличить размер заголовка и метки x/y на графике ggplot2, сохраненном в виде файла PNG, но он отлично работает на экране.

Я упираюсь в небольшую, но немаловажную кирпичную стену этим часто задаваемым вопросом и ответом на него.

Я использую Rstudio 0.97.336 и R 3.0.0 в Linux. Я делаю (гораздо более сложный) график, чтобы поместить его в статью. Размер заголовка и меток x/y по умолчанию слишком мал, чтобы его можно было легко прочитать. Однако очевидный метод исправления этого с помощью функции темы в element_text theme(axis.title.y = element_text(size = rel(1.8)) не работает, если я сохраняю изображение в виде файла PNG. Однако он работает точно как и ожидалось, когда я смотрю на изображения в RStudio, приведенный ниже код точно воспроизводит мою проблему.

##Libraries
library(ggplot2)

set.seed(15612)

##Generate data
Year <- seq(2000,2010)
data <- -2*(Year - 2005) + 10 + runif(11,min=-3,max=3)

Title <- "Title for our graph"
xlab <- "X label"
ylab <- "Y label"

df <- data.frame(Year,data)

##Plot
##First image with small title, xlab, ylab
image1 <- ggplot(df) +
  geom_line(aes(x=Year,y=data)) +
  theme_bw() +
  labs(title=Title,xlab=xlab,ylab=ylab)+
  theme(panel.border = element_rect(fill = NA, colour="grey70"))
image1

ggsave("Image1.png",image1, width=15,height=10,units='cm')

##Second image with larger title, xlab, ylab
image2 <- image1 +
  theme(axis.title.y = element_text(size = rel(1.8), angle = 90)) +
  theme(axis.title.x = element_text(size = rel(1.8), angle = 00)) +
  theme(plot.title = element_text(size = rel(2.0), angle = 00))
image2

ggsave("Image2.png",image2, width=15,height=10,units='cm')

dev.off()
image1
image2

Эти изображения выглядят точно так, как ожидалось на экране в Rstudio. Изображение 1 имеет мелкий размер шрифта для заголовка и т. д., а изображение 2 имеет более крупный размер шрифта, более разборчивый. К сожалению, при сохранении в виде файлов png они идентичны, и оба имеют мелкий шрифт для заголовка, меток x и y.

Я не могу (пока) размещать изображения, поэтому, если вы посмотрите на эти два URL-адреса, вы увидите проблему.

Изображение 1 — мелкий шрифт заголовка

Изображение 2 – шрифт заголовка по-прежнему мелкий, но он должен быть крупнее

Я не вижу, где я сбиваюсь с пути. Я знаю, что есть проблемы (или особенности!) с ленивой оценкой в ​​ggplot2, но я не вижу, где это меня кусает. Буду очень признателен за любую помощь в этом,

С уважением,

Энтони Стейнс


person astaines    schedule 06.05.2013    source источник
comment
FWIW, я не использую RStudio и получаю два разных png.   -  person Matthew Plourde    schedule 06.05.2013
comment
@MatthewPlourde Но с помощью RStudio на Win7 я получаю то же самое. Такое впечатление, что ggsave не замкнул устройство на первом графике и настройки второго графика используются на первом. Это странно. Я не уверен, почему это происходит.   -  person Simon O'Hanlon    schedule 06.05.2013
comment
Пробовал код и в консоли, и в ESS, результат небольшой - два одинаковых файла.   -  person astaines    schedule 07.05.2013
comment
@MatthewPlourde - когда вы говорите, что получаете то же самое, вы имеете в виду, что два файла, сохраненные на диске, одинаковы? Извините, что я не совсем ясно об этом,   -  person astaines    schedule 09.05.2013
comment
@ataines Я получаю разные png, используя только tRGui   -  person Matthew Plourde    schedule 09.05.2013


Ответы (1)


Используя RStudio, я также наблюдаю некоторое странное поведение (но мне нужно немного больше изучить документы, чтобы решить, не так ли, как мы должны ожидать), однако я думаю, что вы можете получить результат вы ожидаете, вызвав ggsave, позволив ему использовать значение по умолчанию plot = last.plot(), затем запустив график, а затем вызвав dev.off() между графиками. то есть

Обходной путь

ggsave("~/Image1.png", width=15,height=10,units='cm')
image1
dev.off()


ggsave("~/Image2.png", width=15,height=10,units='cm')
image2
dev.off()

Воспроизводимый пример такого поведения

Если мы попробуем следующий пример в RStudio, я могу получить то же поведение, что и OP. Запуск первого блока кода ниже в RGui 3.0.0 дает нам то, что мы ожидаем, то есть третье изображение. Однако вот что происходит в RStudio:

## Make plot and save
qp <- qplot(1:5, rnorm(5), size = I(2) )
qp
ggsave("~/Image1.png", width=15,height=10,units='cm')


## Make new plot
qp <- qplot(1:10, rnorm(10), size = I(5) )
qp
ggsave("~/Image2.png", width=15,height=10,units='cm')

На этом этапе, если мы попытаемся открыть сохраненные файлы, мы получим: введите здесь описание изображения

Затем мы просто запускаем dev.off()

## Without calling dev.off() plot 1 is still open and displays nothing
## Plot two is accessible from the filesystem
## Calling dev.off() we then get both plots, but BOTH plots
## use settings from plot 2
dev.off()

И получаем: введите здесь описание изображения

Теперь, если мы попытаемся сохранить графики, вызвав ggsave, затем распечатав графики на экране, а затем вызвав dev.off(), все будет работать, как и ожидалось:

## Now we try calling dev.off() between plots:
qp <- qplot(1:5, rnorm(5), size = I(2) )
ggsave("~/Image1.png", width=15,height=10,units='cm')
qp
dev.off()

## Make new plot
qp <- qplot(1:10, rnorm(10), size = I(5))
ggsave("~/Image2.png", width=15,height=10,units='cm')
qp
dev.off()

Затем мы получаем: введите здесь описание изображения

person Simon O'Hanlon    schedule 06.05.2013
comment
Большое спасибо за это. Я пробовал это с моим исходным кодом, и он не работает! Я также пытался запустить его с консоли, и он дает тот же результат, что и раньше. Есть что-то странное, чего я не понимаю в том, как RStudio использует графические устройства, но это еще не все! Я вижу необходимость прочитать код ggsave. - person astaines; 07.05.2013
comment
Я очень внимательно прочитал код ggsave. Я не думаю, что проблема именно в этом. При использовании R 3.0 в Linux эти два файла идентичны. Это похоже на ошибку ggplot, но может зависеть от платформы. У меня есть только Windows XP и 7, и я попробую их позже завтра, но если у кого-то есть Mac под рукой, может быть, стоит посмотреть? - person astaines; 09.05.2013
comment
Мой все еще не работает - я получаю ошибки в цикле, когда прошу выключить устройство. - person Nova; 29.09.2015