максимальные точки сюжета в R? - PullRequest
7 голосов
/ 26 декабря 2009

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

Если я хочу по-настоящему случайную выборку для точечного графика, легко сказать:

ggplot(x,y,data=myDf[sample(1:nrow(myDf),1000),])

Однако мне было интересно, существуют ли более эффективные (идеально консервированные) способы указания количества точек на графике, чтобы ваши точные данные точно отражались на графике. Итак, вот пример. Предположим, я строю что-то вроде CCDF дистрибутива с тяжелыми хвостами, например,

ccdf <- function(myList,density=FALSE)
{
  # generates the CCDF of a list or vector
  freqs = table(myList)
  X = rev(as.numeric(names(freqs)))
  Y =cumsum(rev(as.list(freqs)));
  data.frame(x=X,count=Y)
}
qplot(x,count,data=ccdf(rlnorm(10000,3,2.4)),log='xy')

Это создаст график, где ось x & y становится все более плотной. Здесь было бы идеально иметь меньше графиков для больших значений x или y.

У кого-нибудь есть какие-либо советы или предложения по решению подобных проблем?

Спасибо, -e

Ответы [ 4 ]

8 голосов
/ 26 декабря 2009

Я склонен использовать png файлы, а не векторную графику, такую ​​как pdf или eps для этой ситуации. Файлы намного меньше, хотя вы теряете разрешение.

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

x <- rnorm(10000); y <- rnorm(10000)
qplot(x, y, colour=I(alpha("blue",1/25)))
5 голосов
/ 26 декабря 2009

Помимо предложений Роба, мне нравится одна графическая функция, поскольку она делает «прореживание» для вас hexbin ; Например, в R Graph Gallery .

4 голосов
/ 26 декабря 2009

Вот одно из возможных решений для графика понижающей дискретизации относительно оси x, если он преобразован в лог. Он регистрирует ось X, округляет это количество и выбирает значение медианы x в этом бункере:

downsampled_qplot <- function(x,y,data,rounding=0, ...) {
  # assumes we are doing log=xy or log=x
  group = factor(round(log(data$x),rounding))
  d <- do.call(rbind, by(data, group, 
    function(X) X[order(X$x)[floor(length(X)/2)],]))
  qplot(x,count,data=d, ...)
}

Используя определение ccdf(), приведенное выше, мы можем затем сравнить исходный график CCDF распределения с версией с пониженной выборкой:

myccdf=ccdf(rlnorm(10000,3,2.4))

qplot(x,count,data=myccdf,log='xy',main='original')

downsampled_qplot(x,count,data=myccdf,log='xy',rounding=1,main='rounding = 1')

downsampled_qplot(x,count,data=myccdf,log='xy',rounding=0,main='rounding = 0')

В формате PDF исходный график занимает 640 КБ, а версии с уменьшенной выборкой занимают 20 КБ и 8 КБ, соответственно.

2 голосов
/ 27 декабря 2009

Я бы либо сделал файлы изображений (устройства png или jpeg) как Rob , о которых уже упоминалось, либо я сделал бы 2D-гистограмму . Альтернативой 2D-гистограмме является сглаженная диаграмма рассеяния , она создает похожую графику, но имеет более плавное срезание от плотных до редких областей пространства.

Если вы никогда раньше не видели addictedtor , стоит посмотреть. Он имеет очень хорошую графику, сгенерированную в R с изображениями и примером кода.

Вот пример кода с сайта addictedtor :

2-я гистограмма:

require(gplots) 

# example data, bivariate normal, no correlation
x <- rnorm(2000, sd=4) 
y <- rnorm(2000, sd=1) 

# separate scales for each axis, this looks circular
hist2d(x,y, nbins=50, col = c("white",heat.colors(16))) 
rug(x,side=1) 
rug(y,side=2) 
box() 

smoothscatter:

library("geneplotter")  ## from BioConductor
require("RColorBrewer") ## from CRAN

x1  <- matrix(rnorm(1e4), ncol=2)
x2  <- matrix(rnorm(1e4, mean=3, sd=1.5), ncol=2)
x   <- rbind(x1,x2)

layout(matrix(1:4, ncol=2, byrow=TRUE))
op <- par(mar=rep(2,4))
smoothScatter(x, nrpoints=0)
smoothScatter(x)
smoothScatter(x, nrpoints=Inf,
              colramp=colorRampPalette(brewer.pal(9,"YlOrRd")),
              bandwidth=40)
colors  <- densCols(x)
plot(x, col=colors, pch=20)

par(op)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...