r - 绘制具有广泛数据 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')
但即使使用颜色,我也会得到类似的结果
显示这些值之间关系的更好方法是什么?谢谢 。
解决方案
在这种情况下,均匀分布(对于“喜欢”和“分享”之间应该是明显的正相关)是数字数据可能被无意加载为一个因素的线索。另一个线索是 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()
推荐阅读
- laravel - Laravel - 测试 - assertJsonMissingExact
- javascript - es6 类中需要构造方法吗
- mysql - MYSQL 用列值更新列
- firebase-realtime-database - 如何从 firebase 数据库中获取特定值?
- mysql - MySQL CASE - 如何处理单个 CASE 语句的多个结果
- python - Python ValueError 和 IndexError
- javascript - 关闭 chrome.runtime.openOptionsPage 的等效命令是什么?
- javascript - dispatchEvent 上的 Chrome 内存泄漏
- sql - 不能在 argMinMerge/argMaxMerge 中使用 Date/DateTime 作为 arg?
- python - Django F() 表达式在函数参数中不起作用