【问题标题】:plotting a scatter plot with wide range data R绘制具有广泛数据 R 的散点图
【发布时间】:2020-01-24 00:22:40
【问题描述】:

我将一个 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')

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

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

【问题讨论】:

  • heatmap in base R 或 geom_bin2d in ggplot2 可能在这里有用。更多策略请参见此处:displayr.com/what-is-overplottingdata-to-viz.com/caveat/overplotting.html
  • 问题似乎是大量的数据点。尝试使用smoothScatterhexbin。这里有几个例子:cddt.nz/visualising-big-data-in-R.html
  • 我怀疑你这里有因子数据,你用 as.numeric 的转换是转换因子的值而不是水平。这可能解释了您所看到的近乎均匀的分布,而我预计这两个度量之间存在很强的线性相关性。尝试将 as.numeric(topMedia$shares_count) 替换为 as.numeric(as.character(topMedia$shares_count)) 并与其他度量值相同。
  • @JonSpring 添加 as.character 后看起来更好!但它改变了轴上的数字。知道为什么吗?谢谢你的帮助。
  • @cddt 我已经用我的 hexbin 尝试更新了我的帖子。它没有改变情节。谢谢

标签: r plot scatter-plot


【解决方案1】:

在这种情况下,均匀分布(“喜欢”和“分享”之间应该是明显的正相关)是数字数据可能被无意加载的一个线索。另一个线索是 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()

如果将该数字数据作为因子加载(如果不包括术语 stringsAsFactors = FALSE,则使用 read.csv 很容易做到),它可能看起来更像这样,与这个问题中的数据并没有太大的不同。这里的数据被当作字符数据来读取,然后变成一个按字母顺序排列的因子,在“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 使用 values 进行排序或绘图,新数据中具有最低 values 的 x 值的 levels 接近 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()

【讨论】:

  • 感谢您的帮助。我的情节现在看起来好多了。
猜你喜欢
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 2021-10-29
  • 2021-03-12
相关资源
最近更新 更多