绘制具有大范围数据R的散点图

时间:2019-09-23 22:10:02

标签: r plot scatter-plot

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

问题是我的赞数从1到1百万开始,而股份数从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))

enter image description here

我尝试使用其他库

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

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

enter image description here

哪种更好的方式显示这些值之间的关系? 谢谢。

1 个答案:

答案 0 :(得分: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()

enter image description here

如果将数值数据作为因素加载(如果不包含术语read.csv,则可以很容易地与stringsAsFactors = FALSE进行比较),它看起来应该更像这样,与其中的数据不太相似这个问题。正在读取这里的数据,就好像它是字符数据一样,然后使其成为按字母顺序排序的因数,因为“ 1”在“ 2”之前,因此“ 10000”在“ 2”之前。

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

x和y值现在具有与它们的字母顺序相关的,与它们的基础级别不同。 R使用进行排序或绘图,新数据中具有 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()

enter image description here

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

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

enter image description here