首页 > 解决方案 > 绘制具有广泛数据 R 的散点图

问题描述

我将一个 csv 文件上传到 R studio 并尝试绘制两列。第一个显示点赞数,第二个显示分享数。我想展示人们真正喜欢帖子时分享数量之间的关系。

问题是我的点赞数从 1 到 100 万,分享数从 5 到 37000。

我的数据集样本(两列都属于类factor

topMedia$likes_count
   [1] 61   120  271  140  59   498  241  117  124  124  225  117  186  101 
  [15] 118  134  152  136  153  124  100  77   98   77   88   48   58   66  


topMedia$shares_count
   [1] 12   171  NULL 23   34   108  430  NULL NULL NULL 283  NULL NULL 57  
  [15] NULL NULL NULL 68   105  NULL NULL 7    10   45   103  22   75   16 

当我使用此代码绘制散点图时。看起来很乱。

plot(as.numeric(topMedia$shares_count),as.numeric(topMedia$likes_count))

在此处输入图像描述

我尝试使用其他库

library(hexbin)

cols = colorRampPalette(c("#fee6ce", "#fd8d3c", "#e6550d", "#a63603"))
plot(hexbin(as.numeric(topMedia$shares_count), as.numeric(topMedia$likes_count), xbins = 40), colorcut = seq(0,1,length=20),
     colramp = function(n) cols(20), legend = FALSE,xlab = 'share count', ylab = 'like count')

但即使使用颜色,我也会得到类似的结果

在此处输入图像描述

显示这些值之间关系的更好方法是什么?谢谢 。

标签: rplotscatter-plot

解决方案


在这种情况下,均匀分布(对于“喜欢”和“分享”之间应该是明显的正相关)是数字数据可能被无意加载为一个因素的线索。另一个线索是 x 和 y 值仅因唯一值的数量而异,而不因基础数值数据的范围而异。我们需要转换因子的水平(而不是因子的值)以查看预期的数字。我们可以用类似的东西来做到这一点as.numeric(as.character(x))


举个例子,假设我们有一些线性相关的数据,如下所示:

library(ggplot2); library(dplyr)
set.seed(42)
fake_data <- data.frame(x = runif(10000, 0, 1000000))
fake_data$y <- pmax(0, fake_data$x*rnorm(10000, 1, 2) + runif(10000, 0, 1000000))
ggplot(fake_data, aes(x,y)) + geom_point()

在此处输入图像描述

如果将该数字数据作为因子加载(read.csv如果不包含该术语,则很容易处理stringsAsFactors = FALSE),它可能看起来更像这样,与此问题中的数据并不太相似。这里的数据被当作字符数据来读取,然后变成一个按字母顺序排列的因子,“2”之前有“10000”,因为“1”在“2”之前。

fake_data_factor <- fake_data %>%
  mutate(x = as.factor(as.character(x)),
         y = as.factor(as.character(y)))

x 和 y 值现在具有与其字母顺序相关的值,与它们的底层级别不同。R 使用这些进行排序或绘图,新数据中具有最低值的 x 值的水平接近 100,000 而不是接近 0。在下表中,第 1 行中的 100,124 按字母顺序排在第 8 行中的 10,058 之前!

fake_data_factor %>%
  arrange(x) %>%
  head(8)
#                 x                y
#1 100124.688120559                0
#2 100229.354342446 289241.187250382
#3 100299.560697749 232233.101769741
#4 100354.233058169 814492.563551191
#5 100364.253856242 1183870.56252858
#6   100370.0227011 1224652.83777805
#7 100461.616180837 1507465.73704898
#8 10058.1261795014 604477.823016668

ggplot(fake_data_factor, aes(as.numeric(x),as.numeric(y))) +
  geom_point()

在此处输入图像描述

我们可以通过将因子转换为字符(提取每个人的级别)然后将它们转换为数字来返回预期的数字。

fake_data_factor %>%
  ggplot(aes(as.numeric(as.character(x)),as.numeric(as.character(y)))) +
  geom_point()

在此处输入图像描述


推荐阅读