R 在具有许多唯一值的大型数据集中,在geom_栏中设置宽度和间隙

R 在具有许多唯一值的大型数据集中,在geom_栏中设置宽度和间隙,r,ggplot2,R,Ggplot2,我的数据框架如下: res<-sample.int(2187, 2187) freq<-floor(runif(2187, 95,105)) t<-data.frame(res,freq) 请注意,此代码适用于唯一值少得多的数据集,如: fac<-factor(rep(c(80,85,100,100.5,100.7,101,101.5,110,105),2000000)) res<-data.frame(fac) new<-data.frame(table

我的数据框架如下:

res<-sample.int(2187, 2187)
freq<-floor(runif(2187, 95,105))
t<-data.frame(res,freq)

请注意,此代码适用于唯一值少得多的数据集,如:

fac<-factor(rep(c(80,85,100,100.5,100.7,101,101.5,110,105),2000000))
res<-data.frame(fac)
new<-data.frame(table(res))
require(scales)
ggplot(new,width=0.1)+
  geom_bar(aes(x=res,y=Freq ,fill = (new$res==101)),
              color = "black",stat = "identity") +
  scale_fill_manual(values=c("darkblue", "lightblue"), guide = F) +
  theme_classic(base_size = 16)+ theme(legend.position = "none")+
  scale_x_discrete(breaks = seq(80, 115, 5))+ scale_y_continuous(labels = comma)
facEdit——在底部添加替代解决方案

如果你有超过2000个条,每一条都有一个1像素宽的黑色轮廓,那么需要6000个水平像素(忽略抗锯齿)才能看到一个不同的填充。大多数屏幕的分辨率远低于此

如果必须使用条形图,并且必须显示每个值,一个选项是使用
color=NA
删除轮廓,并设置
width=1
(作为
geom\u col
/
geom\u bar
调用中的一个术语),这样条形图之间就不会出现分散注意力的空白。即使如此,
res==101
处的不同颜色仅在某些分辨率下可见。(这可能因设备设置和抗锯齿而异。)


如果必须显示所有2000个点,但要突出显示其中一个点,则可以使用不同的几何图形来分散数据,以使用更多的可用空间

例如,我们可以使用
geom_point
geom_jitter
绘制二维空间中的所有坐标。这里,我用
res==101
突出显示元素。我使用
arrange
来确保特殊点最后绘制,这样它就不会被遮挡

library(dplyr)
ggplot(t %>% arrange(res == 101), 
       aes(x = res, y = freq, 
           fill = res == 101, 
           size = res == 101)) +
  geom_jitter(shape = 21, stroke = 0.1)

或者我们可以将数据绘制成一条线,突出显示特殊点:

ggplot(t, aes(res, freq)) + 
  geom_line(color = "gray70") +
  geom_point(data = subset(t, res == 101)) +
  expand_limits(y=0)

可能我完全错了,但如果我理解正确,OP希望使用随机数样本而不是已经列表的计数从头开始复制第二张图表

要创建直方图/条形图,我们只需要一个随机数向量(包装在ggplot的data.frame中),然后让
geom\u bar()
进行计数。此外,将突出显示一个特定的栏

通过使用
floor()
,随机数已被装箱,但仍被
ggplot()
视为连续数。因此,它们需要转化为因素

# create data
set.seed(123L) # ensure random data are reproducible 
t <- data.frame(res = floor(runif(2187, 95, 105)))

library(ggplot2)
ggplot(t) + 
  aes(x = as.factor(res), fill = res == 101) +
  geom_bar() +
  theme_classic(base_size = 16) +
  scale_fill_manual(values = c("darkblue", "lightblue"), guide = FALSE) +
  xlab("res") + 
  ylab("freq")

这里,
breaks
参数用于明确指定箱子边界。或者,可以指定存储箱的数量或宽度。这样就可以灵活地处理参数

编辑2 关于随机数在100和1015之间均匀分布的情况,OP。通过调整中断顺序

set.seed(123L) # ensure random data are reproducible 
t3 <- data.frame(res = runif(2187, 100, 1015))

ggplot(t3) + 
  aes(x = res, fill = floor(res) == 101) +
  geom_histogram(breaks = seq(100, 1015, 1), closed = "left") +
  theme_classic(base_size = 16) +
  scale_fill_manual(values = c("darkblue", "lightblue"), guide = FALSE) +
  xlab("res") + 
  ylab("freq")


请注意,
101
仍在左下角突出显示。

有太多的条带使此操作可行。为什么不使用
geom_segment
来创建行呢?我该怎么做呢?谢谢,但是如果数据帧是:t,那么没有明确的方法使其更可见,就像第二个屏幕截图中的值更少一样
# create data
set.seed(123L) # ensure random data are reproducible 
t <- data.frame(res = floor(runif(2187, 95, 105)))

library(ggplot2)
ggplot(t) + 
  aes(x = as.factor(res), fill = res == 101) +
  geom_bar() +
  theme_classic(base_size = 16) +
  scale_fill_manual(values = c("darkblue", "lightblue"), guide = FALSE) +
  xlab("res") + 
  ylab("freq")
set.seed(123L) # ensure random data are reproducible 
t2 <- data.frame(res = runif(2187, 95,105)) # floor() omitted here

ggplot(t2) + 
  aes(x = res, fill = floor(res) == 101) +
  geom_histogram(breaks = seq(95, 105, 1), closed = "left") +
  theme_classic(base_size = 16) +
  scale_fill_manual(values = c("darkblue", "lightblue"), guide = FALSE) +
  xlab("res") + 
  ylab("freq")
set.seed(123L) # ensure random data are reproducible 
t3 <- data.frame(res = runif(2187, 100, 1015))

ggplot(t3) + 
  aes(x = res, fill = floor(res) == 101) +
  geom_histogram(breaks = seq(100, 1015, 1), closed = "left") +
  theme_classic(base_size = 16) +
  scale_fill_manual(values = c("darkblue", "lightblue"), guide = FALSE) +
  xlab("res") + 
  ylab("freq")
ggplot(t3) + 
  aes(x = res, fill = floor(res) == 101) +
  geom_histogram(bins = 100L) +
  theme_classic(base_size = 16) +
  scale_fill_manual(values = c("darkblue", "lightblue"), guide = FALSE) +
  xlab("res") + 
  ylab("freq")