2015-07-18 2 views
1

Я написал следующий код для построения моих xy-данных по набору повторно масштабируемых осей, значения, содержащиеся в pointSize, - это правильно масштабированные вертикальные/горизонтальные диаметры точки, которую я хочу на каждой построенной координате. Как я могу заставить это работать? Прямо сейчас я просто рисую точки с любым масштабированием, используемым по умолчанию в geom_point (aes (size)), и точки не масштабируются с осями. Как только я перемасштабирую оси с координатором, я хочу, чтобы нанесенные точки увеличивались/уменьшались относительно осей соответственно.R: масштаб geom_point с осями (ggplot2)

Например, если размер точки равен 5, это означает, что горизонтальный и вертикальный диаметр точки равен 5 относительно осей, независимо от указанного xyScaling.

EDIT: мин в pointSize должно быть мин = 0, а не мин = -10

Минимальная воспроизводимая код:

# Sample size & x-y axes plot boundaries 
sampleSize <- 100 

# Set scale factor of x-y axes 
xyScaling <- 1 

# Set to false once sampled to rescale axis with same distributions 
resample <- TRUE 

if (resample == TRUE){ 
    xSample <- replicate(sampleSize, runif(1, min = -sampleSize/2, max = sampleSize/2)) 

    ySample <- replicate(sampleSize, runif(1, min = -sampleSize/2, max = sampleSize/2)) 

    pointSize <- replicate(sampleSize, runif(1, min = 0, max = 10)) 
} 

sampleDataFrame <- data.frame(xSample, ySample, pointSize) 
samplePlot <- ggplot(sampleDataFrame, aes(xSample, ySample)) 
samplePlot + 
geom_point(data = sampleDataFrame, aes(size = sampleDataFrame$pointSize[])) + 
coord_cartesian(xlim = c((xyScaling*(-sampleSize/2)),(xyScaling*(sampleSize/2))), 
       ylim = c((xyScaling*(-sampleSize/2)),(xyScaling*(sampleSize/2)))) + 
xlab("x") + 
ylab("y") + 
scale_size_identity(guide=FALSE) 

EDIT: Так что я почти удалось решить проблему с помощью geom_rect, следующий код делает то, что я хочу, с оговоркой, что точки являются прямоугольниками, а не эллипсами/кругами, я не мог заставить это работать с эллипсами, если бы кто-нибудь мог направить меня к правильной функции, я был бы очень благодарен.

sampleDataFrame <- data.frame(xSample, ySample, pointSize) 

samplePlot <- ggplot(sampleDataFrame) 
samplePlot + 
    geom_point(aes(xSample, ySample, size = 0)) + 
    geom_rect(aes(xmin = xSample-(pointSize/2), xmax = xSample+(pointSize/2), ymin = ySample-(pointSize/2), ymax = ySample+(pointSize/2))) + 
    coord_cartesian(xlim = c((xyScaling*(-sampleSize/2)),(xyScaling*(sampleSize/2))), 
        ylim = c((xyScaling*(-sampleSize/2)),(xyScaling*(sampleSize/2)))) + 
    xlab("x") + 
    ylab("y") + 
    scale_size_identity(guide=FALSE) 
+1

Предоставление ответа было бы намного проще и веселее с [ минимальный воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – RHertel

+0

Мой плохой, это мой первый раз при переполнении стека, вернется с «минимальным воспроизводимым примером» как можно скорее. – PhysWhiz

+0

Как подсказка с тем же образцом, что и при повторном запуске скрипта, если вы используете команду 'set.seed (1000)', где '1000' может быть любым числом, будут выбраны одинаковые случайные числа. Это похоже на то, что у «R» есть список «случайных» чисел, и функция 'set.seed' сообщает ему, в какой момент начать чтение списка. –

ответ

1

этот has been suggested in the past, но я не думаю, что он был реализован. Одна из проблем заключается в том, что круги являются круглыми в специальном случае декартовых координат с единичным соотношением сторон. Самое легкое обходное решение - это, вероятно, создание data.frame с xy позициями, описывающими круги (эллипсы) и нарисовать их как полигоны.

library(gridExtra) 
library(ggplot2) 

circle <- polygon_regular(50) 

pointy_points <- function(x, y, size){ 
    do.call(rbind, mapply(function(x,y,size,id) 
    data.frame(x=size*circle[,1]+x, y=size*circle[,2]+y, id=id), 
     x=x,y=y, size=size, id=seq_along(x), SIMPLIFY=FALSE)) 

} 

test <- pointy_points(1:10, 1:10, size=seq(0.2, 1, length.out=10)) 

ggplot(test, aes(x,y,group=id, fill=id)) + geom_polygon() 

enter image description here

+0

Спасибо за предложения, я буду заниматься этим и расскажу вам, если это сработает. – PhysWhiz

+0

Великолепный, это позволило мне достичь именно того, что мне было нужно, огромное спасибо! – PhysWhiz

1

Вы могли бы попытаться изменить точки на самом низком уровне, но это довольно неудобный,

library(ggplot2); library(grid) 
p <- qplot(1:10, 1:10, size=I(10)) 
g <- ggplotGrob(p) 

points <- g$grobs[[4]][["children"]][[2]] 
g$grobs[[4]][["children"]][[2]] <- 
    editGrob(points, size = convertUnit(points$size, unitTo = "npc")) 

grid.newpage() 
grid.draw(g) 
Смежные вопросы