r中的散点图具有巨大的独特观察效果

问题描述 投票:2回答:2

目前,情节没用。我如何绘制这个分布,因为范围太高了?

我有50年的数据,并且必须查看哪种活动最有害。

该数据包含大约1000个独特的活动,例如column1。我正在使用groupby(column1)summarise(total = sum(column2,column3)),但问题是6到7位数的总值很少,因为这两个事实我的情节x看起来很糟糕并且由于很少的高值y大多数值都在x轴附近。

我认为问题出在x轴,因为由于空间较小,所以很多名称都聚集在一起。

r plot distribution scatter-plot outliers
2个回答
2
投票

我认为日志转换可以帮助您从数据中获得更好的洞察力:

设置一些类似于您的情况的假数据:

set.seed(1776)        # reproducible random numbers
num_obs <- 10000      # set number of observations
options(scipen = 999) # don't use scientific notation

# don't worry about this code, just creating a reproducible example
y <- abs(rnorm(num_obs) + 2) * abs(rnorm(num_obs) * 50)
make_these_outliers <- runif(num_obs, min=0, max=1) > 0.99
y[make_these_outliers] <- abs(rnorm(sum(make_these_outliers), + 2) * 
abs(rnorm(sum(make_these_outliers)) * 50000))

重新创建您现在拥有的情节,以显示您所面临的问题:

# recreating your current situation
plot(y, main='Ugly Plot')

ugly plot

Log10转换

现在我们将对您的数据使用log10转换,以显示结果。因此值“10”现在为“1”,“100”的值现为“2”,“1000”的值现为“3”等。

# log10
plot(log10(y), col= rgb(0, 0, 0, alpha=0.3), pch=16, main='Log Scale and Transparency - Slightly Better')

log10_base_R

pch = 16参数填充点,alpha = 0.4设置每个点的不透明度。 α值为0.4意味着不透明度为40%(也可以将其视为60%透明度)。

GGPLOT2

我还将在ggplot2中展示这一点,因为使用比例变换,ggplot2非常聪明,可以将真值放在y轴上,以防止你不得不在头脑中进行log10变换的心理体操。

# now with ggplot2 
# install.packages("ggplot2")    # <-- run this if you haven't installed ggplot2 yet
library(ggplot2)

# ggplot2 prefers your data to be in a data.frame (makes it easier to work with)
data_df <- data.frame(
    index = 1:num_obs,
    y = y)


ggplot(data = data_df, aes(x = index, y = y)) +
    geom_point(alpha=0.2) +
    scale_y_continuous(trans="log10") +
    ggtitle("Y-axis reflects values of the datapoints", "even better?") +
    theme_bw(base_size = 12)

enter image description here

此时,您可以开始讲述我是如何构建假数据的,这就是为什么在10-1000范围内存在如此高浓度的点。

希望这有帮助!我绝对建议接受PauloH的建议并询问stats.stackexchange.com以确保您不会歪曲您的数据。


2
投票

使用ggplot2代替并设置alpha可能会解决您的问题,但如果这还不够,您可能需要从zoom_facet()包中的ggforce标记。

set.seed(1776)      
num_obs <- 10000     
options(scipen = 999) 

y <- abs(rnorm(num_obs) + 2) * abs(rnorm(num_obs) * 50)
make_these_outliers <- runif(num_obs, min=0, max=1) > 0.99
y[make_these_outliers] <- abs(rnorm(sum(make_these_outliers), + 2) * 
                                abs(rnorm(sum(make_these_outliers)) * 50000))

# install.packages('ggplot2')
library(ggplot2)
# install.packages('ggforce')
library(ggforce)

data_df <- data.frame(
  index = 1:num_obs,
  y = y)


ggplot(data = data_df, aes(x = index, y = y)) +
  geom_point(alpha=0.05) +
  facet_zoom(y = (y <= 500), zoom.size = .8) +
  theme_bw()

结果看起来或多或少如下:enter image description here

希望能帮助到你。检查ggforce的GitHub:

https://github.com/thomasp85/ggforce

© www.soinside.com 2019 - 2024. All rights reserved.