[英]R: Scale geom_point with axes (ggplot2)
我編寫了以下代碼,以將我的xy數據繪制在一組可重新縮放的軸上,pointSize中包含的值是在每個繪制坐標處要正確縮放的點的垂直/水平直徑。 我該如何開始工作呢? 現在,我只是使用geom_point(aes(size))中默認使用的任何縮放比例繪制點,並且這些點不隨軸縮放。 使用coord_cartesian重新縮放軸后,我希望繪制的點相對於軸相應地增加/減少。
例如,如果點的大小為5,則意味着我希望點的水平和垂直直徑相對於軸為5,無論指定的xyScaling如何。
編輯:pointSize中的min應該是min = 0,而不是min = -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)
編輯:所以我幾乎可以通過使用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)
過去曾有人建議這樣做,但我認為它沒有實現。 一個問題是,在具有單位長寬比的笛卡爾坐標的特殊情況下,圓僅是圓形的。 最簡單的解決方法可能是創建一個具有xy位置(描述圓(橢圓))的data.frame並將其繪制為多邊形。
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()
您可以嘗試在最低級別上編輯點,但這很奇怪,
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.