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

Методы добавления Excel-подобных функций в R-графики?

Я уже говорил с графическими параметрами R, пытаясь сделать мои сюжеты более профессиональными (например, las=1, bty="n" обычно помогает). Начал играть с tikzDevice, что было большим улучшением в моем сознании. Удивительно, насколько лучше выглядят вещи, когда размер шрифта и стили на рисунке совпадают с размерами окружающего документа.

Я хотел бы добавить несколько эффектов к моим сюжетам, и я заинтересован в методах делать это воспроизводимым образом. Я понимаю, что это можно рассматривать как "харк-диаграмму", но я нахожу, что в моей области добавления их полезно, чтобы результат считался профессиональным.

В частности, я хотел бы создать любой или все из следующих эффектов:

  • Градиентное затенение gradient shading
  • Округлые углы rounded corners
  • Теневые эффекты

shadows

Код, ссылки на соответствующие пакеты или схемы стратегий для достижения этих эффектов были бы полезными. Спасибо.

4b9b3361

Ответ 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, ...)
}