gpt4 book ai didi

r - plot/ggplot2 - 用太多点填充区域

转载 作者:行者123 更新时间:2023-12-02 09:01:42 30 4
gpt4 key购买 nike

最终实现 - 尚未完成,但正在朝着正确的方向发展

想法/问题:您的绘图有许多重叠点,并且希望将它们替换为平坦区域,从而提高查看绘图的性能。

可能的实现:计算所有点之间的距离矩阵,并将低于指定距离的所有点连接起来。

待办事项/未完成:目前,这适用于根据打印图的大小手动设置距离。我在这里停下来是因为结果不符合我的审美。

带有中间图的最小示例

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()

plot00 - points with group color

# 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()

plot01 - all single points in one group

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()

plot02 - only "single"-points (less than 4 connected points)

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()

plot03 - final

初始问题

我有一个(也许很奇怪)问题。

在某些图中,我的分析中有数千个点。为了显示它们,电脑需要相当多的时间,因为点太多了。现在,其中许多点可以重叠,我有一个填充区域(这很好!)。为了节省显示时间/精力,仅填充该区域但单独绘制每个点会很有用。

我知道热图等有可能性,但这不是我的想法。我的想法是这样的:

#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)

ggplot2

# NO ggplot2
plot(df, pch=19)

plot

编辑:
要获得像 fdetsch 提到的密度图(我如何标记名称?),有一些关于这个主题的问题。但这并不是我想要的东西。我知道我的担心有点奇怪,但有时必要时,密度会让情节变得更加繁忙。

具有密度的主题链接:

Scatterplot with too many points
High Density Scatter Plots

最佳答案

使用lattice中的panel.smoothScatter怎么样?它在低密度区域显示一定数量的点(请参阅参数“nrpoints”),而在其他地方,显示点密度而不是单个(可能重叠)点,从而提供对数据更有意义的见解。另请参阅 ?panel.smoothScatter 了解更多信息。

## load 'lattice'
library(lattice)

## display point densities
xyplot(y ~ x, data = df, panel = function(x, y, ...) {
panel.smoothScatter(x, y, nbin = 250, ...)
})

enter image description here

关于r - plot/ggplot2 - 用太多点填充区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35035270/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com