Методы добавления Excel-подобных функций в R-графики?
Я уже говорил с графическими параметрами R, пытаясь сделать мои сюжеты более профессиональными (например, las=1
, bty="n"
обычно помогает). Начал играть с tikzDevice
, что было большим улучшением в моем сознании. Удивительно, насколько лучше выглядят вещи, когда размер шрифта и стили на рисунке совпадают с размерами окружающего документа.
Я хотел бы добавить несколько эффектов к моим сюжетам, и я заинтересован в методах делать это воспроизводимым образом. Я понимаю, что это можно рассматривать как "харк-диаграмму", но я нахожу, что в моей области добавления их полезно, чтобы результат считался профессиональным.
В частности, я хотел бы создать любой или все из следующих эффектов:
- Градиентное затенение
![gradient shading]()
- Округлые углы
![rounded corners]()
- Теневые эффекты
![shadows]()
Код, ссылки на соответствующие пакеты или схемы стратегий для достижения этих эффектов были бы полезными. Спасибо.
Ответы
Ответ 1
Вы можете создавать теневые линии, рисуя несколько строк со смещением от линии, генерирующей тень. Начните с широкой линии (lwd = 30, скажем), нарисованной в бледно-сером (серый (1)), а затем нарисуйте более тонкие линии, окрашенные до серого (.5). Там одна тень.
package: grid имеет функцию для закругленных прямоугольников. Или вы можете нарисовать их в базовой графике, используя сегмент и линию и немного древней греческой геометрии.
Психоделические фоны можно разделить на базовый графический холст с помощью "изображения". Создайте изображение, используя пакет "растр" в любом разрешении.
Вы также можете использовать пакет под названием RGoogleVis для взаимодействия с графическим картой Google или экспорта в JSON и использовать что-то вроде D3 для корпоративной интерактивной графики:
http://mbostock.github.com/d3/ex/
Или просто загрузите данные чернил в Excel уже.
Ответ 2
Я не мог с собой поделать: использовал это изображение и адаптировал this пример от Пола Мюррелла. Люди, которые хотят делать подобные вещи, могут найти эту ссылку из R wiki, хотя она немного старше и не использует преимущества новых (ish) растровых возможностей. Этот пост является примером размещения графики ggplot
в кадре со скругленными углами.
изменить: много помощи от Baptiste.
library(png)
library(grid)
imgfile <- "http://upload.wikimedia.org/wikipedia/commons/e/e1/Tie-dye.png"
download.file(imgfile,dest="tiedye.png")
r <- readPNG("tiedye.png")
rmat <- matrix(rgb(r[,,1],r[,,2],r[,,3],alpha=0.4),
nrow=dim(r)[1])
Функция для затененных точек:
shadow.points <- function(x, y, size=unit(1, "char"), default.units="native", ...) {
if(!is.unit(x)) {x <- unit(x, default.units) }
if(!is.unit(y)) { y <- unit(y, default.units) }
grid::grid.points(x+0.2*size, y-0.2*size, size=size, gp=gpar(col="black"), pch=20)
grid::grid.points(x, y, size=size, default.units=default.units, ...)
}
Настроить маску на основе grid.roundrect
:
png("mask.png",width=ncol(r), height=nrow(r), res=1)
grid.roundrect(gp=gpar(fill="black"))
dev.off()
m <- readPNG("mask.png", native=FALSE)
mask <- matrix(rgb(m[,,1],m[,,2],m[,,3]),
nrow=dim(m)[1])
rmat[mask == "#FFFFFF"] <- "#FFFFFF"
(Остерегайтесь, я думаю, есть некоторые различия в поддержке для пиксельных изменений прозрачности на разных платформах (например, это может не работать в Windows?)) предупреждение: могут быть артефакты на других платформах тоже - фон не появился на PNG, мне пришлось экспортировать в формате PDF...
grid.newpage()
pushViewport(plotViewport(),
viewport(xscale=c(0, 10), yscale=c(0, 10)))
grid.raster(rmat,x=unit(0,"native"),y=unit(0,"native"),
width=1,height=1,just=c(0,0))
grid.roundrect() ## frame
grid.xaxis(at=seq(2,8,by=2)) ## axes -- shorter to avoid going beyond end of frame
grid.yaxis(at=seq(2,8,by=2))
shadow.points(x=rnorm(10,mean=5),y=rnorm(10,mean=5),pch=20,
gp=gpar(col="cyan"))
![tiedye]()
Ответ 3
Используя закругленные прямоугольники как маску клипа в примере @Ben Bolker,
png("mask.png",width=ncol(r), height=nrow(r), res=1); grid.roundrect(gp=gpar(fill="black")); dev.off()
m <- readPNG("mask.png", native=FALSE)
mask <- matrix(rgb(m[,,1],m[,,2],m[,,3]),
nrow=dim(m)[1])
rmat[mask == "#FFFFFF"] <- "#FFFFFF"
grid.raster(rmat)
grid.roundrect()
Ответ 4
Добавление тени к примеру Бена Болкера,
grid.points <- function(x, y, size=unit(1, "char"), default.units="native", ...) {
if(!is.unit(x)) {x <- unit(x, default.units) }
if(!is.unit(y)) { y <- unit(y, default.units) }
grid::grid.points(x+0.2*size, y-0.2*size, size=size, gp=gpar(col="black"), pch=20)
grid::grid.points(x, y, size=size, default.units=default.units, ...)
}