Окончательной реализации - не закончен, но заголовок правильного путиучастка/ggplot2 - Залейте область со слишком большим количеством точек
Idea/Проблема: У вас есть сюжет с множеством перекрывающихся точек и хотите заменить их равную площадь, что увеличивает производительность просмотра сюжета.
Возможная реализация: Рассчитать матрицу расстояний между всеми точками и соединить все точки ниже указанного расстояния.
Todo/Not finished: В настоящее время это работает для заданных вручную расстояний в зависимости от размера печатного участка. Я остановился здесь, потому что результат не соответствовал моему эстетическому смыслу.
Минимальный пример с промежуточными участками
set.seed(074079089)
n.points <- 3000
mat <- matrix(rnorm(n.points*2, 0,0.2), nrow=n.points, ncol=2)
colnames(mat) <- c("x", "y")
d.mat <- dist(mat)
fit.mat <-hclust(d.mat, method = "single")
lims <- c(-1,1)
real.lims <- lims*1.1 ## ggplot invokes them approximately
# An attempt to estimate the point-sizes, works for default pdfs pdf("test.pdf")
cutsize <- sum(abs(real.lims))/100
groups <- cutree(fit.mat, h=cutsize) # cut tree at height cutsize
# plot(fit.mat) # display dendogram
# draw dendogram with red borders around the 5 clusters
# rect.hclust(fit.mat, h=cutsize, border="red")
library(ggplot2)
df <- data.frame(mat)
df$groups <- groups
plot00 <- ggplot(data=df, aes(x,y, col=factor(groups))) +
geom_point() + guides(col=FALSE) + xlim(lims) + ylim(lims)+
ggtitle("Each color is a group")
pdf("plot00.pdf")
print(plot00)
dev.off()
# If less than 4 points are connected, show them seperately
t.groups <- table(groups) # how often which group
drop.group <- as.numeric(names(t.groups[t.groups<4])) # groups with less than 4 points are taken together
groups[groups %in% drop.group] <- 0 # in group 0
df$groups <- groups
plot01 <- ggplot(data=df, aes(x,y, col=factor(groups))) +
geom_point() + xlim(lims)+ ylim(lims) +
scale_color_hue(l=10)
pdf("plot01.pdf")
print(plot01)
dev.off()
find_hull <- function(df_0)
{
return(df_0[chull(df_0$x, df_0$y), ])
}
library(plyr)
single.points.df <- df[df$groups == 0 , ]
connected.points.df <- df[df$groups != 0 , ]
hulls <- ddply(connected.points.df, "groups", find_hull) # for all groups find a hull
plot02 <- ggplot() +
geom_point(data=single.points.df, aes(x,y, col=factor(groups))) +
xlim(lims)+ ylim(lims) +
scale_color_hue(l=10)
pdf("plot02.pdf")
print(plot02)
dev.off()
plot03 <- plot02
for(grp in names(table(hulls$groups)))
{
plot03 <- plot03 + geom_polygon(data=hulls[hulls$groups==grp, ],
aes(x,y), alpha=0.4)
}
# print(plot03)
plot01 <- plot01 + theme(legend.position="none")
plot03 <- plot03 + theme(legend.position="none")
# multiplot(plot01, plot03, cols=2)
pdf("plot03.pdf")
print(plot03)
dev.off()
Initial Вопрос
У меня есть (может быть нечетным) вопрос.
На некоторых участках у меня есть тысячи точек в моем анализе. Чтобы отобразить их, компьютер занимает довольно много времени, потому что их так много. После этого многие из этих точек могут перекрываться, у меня есть заполненная область (это нормально!). Чтобы сэкономить время и усилия, было бы полезно просто заполнить эту область, но построение каждой точки само по себе.
Я знаю, что есть возможности в тепловых картах и т. Д., Но это не идея, которую я имею в виду. Моя идея что-то вроде:
#plot00: ggplot with many many points and a filled area of points
plot00 <- plot00 + fill.crowded.areas()
# with plot(), I sadly have an idea how to manage it
Любые идеи? Или это никто не будет делать в любое время?
# Example code
# install.packages("ggplot2")
library(ggplot2)
n.points <- 10000
mat <- matrix(rexp(n.points*2), nrow=n.points, ncol=2)
colnames(mat) <- c("x", "y")
df <- data.frame(mat)
plot00 <- ggplot(df, aes(x=x, y=y)) +
theme_bw() + # white background, grey strips
geom_point(shape=19)# Aussehen der Punkte
print(plot00)
# NO ggplot2
plot(df, pch=19)
Edit:
Чтобы иметь плотности участков, как упомянуто fdetsch (как я могу отметить имя?) Есть некоторые вопросы, касающиеся этого тема. Но это не то, что я хочу точно. Я знаю, что мое беспокойство немного странно, но плотности делают сюжет более занятым, когда это необходимо.
Ссылки на темы с плотностью:
Scatterplot with too many points
High Density Scatter Plots
То, что вы просите, потому что трудно Рендеринг сплошной блок зависит от выбранных вами графических параметров (например, размера точек). Чтобы создать сплошные области, вам необходимо буферизовать точки в один слой так же, как Географическая информационная система - [этот вопрос] (https://stackoverflow.com/questions/25411251/buffer-geospatial-points-in-r -with-gbuffer) может помочь. – geotheory