построение точечной диаграммы с широким диапазоном данных R - PullRequest
2 голосов
/ 24 сентября 2019

Я загрузил 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 Ответ

1 голос
/ 24 сентября 2019

В этом случае равномерное распределение (что должно быть явным положительным соотношением между «лайками» и «долями») является подсказкой о том, что числовые данные могли быть непреднамеренно загружены как фактор.Другая подсказка заключается в том, что значения 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 не включен), это может выглядеть скорее так, но не слишкомотличается от данных в этом вопросе.Данные здесь читаются так, как если бы это были символьные данные, а затем преобразуются в коэффициент, который упорядочен в алфавитном порядке, с «10000» перед «2», потому что «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. ВВ приведенной ниже таблице 100 124 в строке 1 расположены в алфавитном порядке раньше, чем 10 058 в строке 8!

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

...