#r #ggplot2 #ggforce
#r #ggplot2 #ggforce
Вопрос:
У меня есть data.frame в R 4.0.2 с непрерывной переменной в одном столбце и двумя возможными значениями категориальной переменной (переменная ‘type’: известная или новая) в другом, которую я использую, чтобы раскрасить их по-разному (используя палитру из пакета ggsci 2.9). Я представляю гистограмму (stat_bin) с помощью ggplot2 3.3.2, и я хочу использовать функцию facet_zoom в ggforce 0.3.2 для масштабирования только данных, принадлежащих одному из «типов» (используя опцию zoom.data, как это сделано в примере с вулканом на http://cran.univ-paris1.fr/web/packages/ggforce/vignettes/Visual_Guide.html#contextual-zoom ), однако я получаю эту ошибку:
Error: Aesthetics must be either length 1 or the same as the data (2000): x
Воспроизводимый пример:
library(ggplot2)
library(ggsci)
library(ggforce)
testdata <- as.data.frame(sort(rnorm(1000)))
testdata$type <- "known"
testdata[501:1000,2] <- "novel"
# Working code
ggplot(testdata)
stat_bin(aes(x=testdata[,1], fill = type), binwidth = 1, color="white")
scale_fill_npg() theme_light()
facet_zoom(xlim = c(0, 4), ylim = c(0, 300), horizontal = TRUE, zoom.size = 0.3)
# Desired code
ggplot(testdata)
stat_bin(aes(x=testdata[,1], fill = type), data = cbind(testdata, zoom = FALSE), binwidth = 1, color="white")
stat_bin(aes(x=testdata[testdata$type == "novel",1]), data = cbind(testdata, zoom = TRUE), binwidth = 0.5)
scale_fill_npg() theme_light()
facet_zoom(xlim = c(0, 4), ylim = c(0, 300), horizontal = TRUE, zoom.size = 0.3, zoom.data = zoom)
Спасибо!
Ответ №1:
Проблема в том, что вы передаете весь набор данных в качестве данных во втором stat_bin
. Просто передайте подмножество df вместо того, чтобы пытаться подмножить в aes()
:
Кстати: я также переименовал первую переменную в ваших данных в x.
library(ggplot2)
library(ggsci)
library(ggforce)
set.seed(42)
testdata <- data.frame(x = sort(rnorm(1000)))
testdata$type <- "known"
testdata[501:1000,2] <- "novel"
# Desired code
ggplot(testdata)
stat_bin(aes(x = x, fill = type), data = cbind(testdata, zoom = FALSE), binwidth = 1, color="white")
stat_bin(aes(x = x), data = cbind(testdata[testdata$type == "novel", ], zoom = TRUE), binwidth = 0.5)
scale_fill_npg() theme_light()
facet_zoom(xlim = c(0, 4), ylim = c(0, 300), horizontal = TRUE, zoom.size = 0.3, zoom.data = zoom)
Комментарии:
1. Я хотел представить увеличенные данные по-другому, так что это решение сработало! Большое вам спасибо!
Ответ №2:
Чтобы отобразить type == "novel"
данные только на увеличенном графике, попробуйте следующее:
library(tidyverse)
library(ggsci)
library(ggforce)
testdata <- data.frame(values = sort(rnorm(1000)))
testdata$type <- "known"
testdata[501:1000,2] <- "novel"
# Desired code
ggplot(testdata)
stat_bin(aes(x = values, fill = type),
binwidth = 1, color="white")
scale_fill_npg() theme_light()
facet_zoom(zoom.data = ifelse(type == "novel", NA, FALSE),
xlim = c(0, 4), ylim = c(0, 300),
horizontal = TRUE)