Подтвердить что ты не робот

R: функция масштабирования ggplot2, решетки или базового R-графика пропорционально

В R мне всегда кажется, что это раздражает, что основания R, решетки и графики ggplot2 работают с абсолютными размерами точек для размера текста и символов графика.

Это означает, что если вы увеличите размер окна вашего сюжета, чтобы получить графа заполнения страницы из

windows(width=5,height=5);qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7))

к

windows(width=10,height=10);qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7))

что относительное масштабирование символов текста и графика изменяется относительно остальных. То же самое касается оснований R и графиков решетки.

В контексте некоторых функций экспорта графов, которые я пишу, мне было интересно, можно ли написать функцию, которая будет выводить на выходе текущего графического устройства (к которому можно получить доступ с помощью recordPlot()), и масштабировать все графических символов и текста, а также ширины линий на произвольном%, что позволяет экспортировать граф любого размера, сохраняя при этом одинаковый внешний вид? То есть функцию пропорционально масштабировать весь график до большего или меньшего размера, сохраняя при этом одинаковый вид?

PS то же самое потребуется, чтобы иметь возможность масштабировать окно сюжета RStudio на экранах с высоким разрешением DPI 4K и все еще сделать его разборчивым (прямо сейчас RStudio использует удвоение пикселей, но это делает график окно выглядит действительно нечетким, а также вызывает проблемы в сочетании с Cleartype в Windows, вызывая цветовое окантовку).

4b9b3361

Ответ 1

по какой-то причине размер точки кодируется как fontsize, поэтому нетрудно преобразовать его в единицы, которые будут масштабироваться автоматически. Если вы знаете, какое масштабирование вы хотите применить, то следующее может помочь

library(ggplot2)
p <- qplot(Sepal.Length, Petal.Length, data = iris, 
           geom=c("point","line"),
           color = Species, size = Petal.Width, alpha = I(0.7))

library(gtable)
library(grid)

g <- ggplotGrob(p)
pts <- g$grobs[[4]][["children"]][[2]] # geom_point layer
lns <- g$grobs[[4]][["children"]][[3]] # geom_line layer
g$grobs[[4]][["children"]][[2]] <- editGrob(pts, size=1.2*pts$size)
gp <- modifyList(lns$gp, list(lwd=1.2*lns$gp$lwd))
g$grobs[[4]][["children"]][[3]] <- editGrob(lns, gp=gp)

grid.newpage()
grid.draw(g)

введите описание изображения здесь

Ответ 2

Это, кажется, ближе к вашей конечной цели

library(ggplot2)
p <- qplot(Sepal.Length, Petal.Length, data = iris, 
           geom=c("point","line"),
           color = Species, size = Petal.Width, alpha = I(0.7))
library(grid)
print(p, vp=viewport(gp=gpar(cex=2, lex=2)))