ggplot geom_col: автоматически определять y из данных?
У меня есть датафрейм, который выглядит так:
A B C
0,868385346 0,628248588 0,468926554
0,074626866 0,277966102 0,271186441
0,024423338 0,057627119 0,203389831
0,017639077 0,007909605 0,011299435
0,004070556 0,007909605 0,011299435
0,004070556 0,005649718 0,011299435
0,002713704 0,003389831 0,005649718
0,001356852 0,001129944 0,005649718
0,001356852 0,001129944 0,005649718
0,001356852 0,001129944 0,005649718
0,001129944
0,001129944
0,001129944
0,001129944
0,001129944
0,001129944
0,001129944
Это пропорции композиций A, B и C (цифры добавляются к 1, с самой высокой цифрой вверху)
Я хочу сделать гистограмму с A, B, C на оси x (или граненую, но я увижу это позже), а для каждого - столбец, показывающий фактические данные (так, для A - десять столбцов, показывающих пропорции первый - 0,86, второй - 0,07 и т. д.), чтобы сравнить различное распределение в композиции.
Документация ggplot гласит: "Если вы хотите, чтобы высота столбцов представляла значения в данных, используйте вместо этого geom_col", что именно то, что я хочу.
Я запускаю следующее с помощью na.omit, так как разные столбцы имеют разное количество строк
ggplot(na.omit(данные)) + geom_col()
Я получаю следующую ошибку: Ошибка в pmin(y, 0): объект 'y' не найден
Я вижу, что я должен назначить a y (в документации geom_bar, поскольку кажется, что geom_col не имеет собственной документации). Я пробовал разные вещи, чтобы получить масштаб от 0 до 1, например, y=c(0:1), но, похоже, ничего не работает.
Я до сих пор не понимаю, как назначить ось Y, в то время как функция geom_col говорит, что она делает высоту столбца из данных...
Я, очевидно, здесь упускаю что-то простое, поэтому любые указатели будут оценены.
2 ответа
Вы должны конвертировать ваши данные из широкоформатного формата в длинный, например: dat2
в моем примере. Вам также нужно будет создать ID
колонка. После этого вы можете использовать geom_col
построить гистограмму. В приведенном ниже примере кода я также показываю, как установить ограничение по оси Y и использовать facet_grid
,
library(tidyverse)
dat2 <- dat %>%
mutate(ID = 1:n()) %>%
gather(Column, Value, -ID)
ggplot(dat2, aes(x = ID, y = Value)) +
geom_col() +
scale_y_continuous(limits = c(0, 1)) +
facet_grid(Column ~ .) +
theme_bw()
ДАННЫЕ
dat <- read.table(text = "A B C
0.868385346 0.628248588 0.468926554
0.074626866 0.277966102 0.271186441
0.024423338 0.057627119 0.203389831
0.017639077 0.007909605 0.011299435
0.004070556 0.007909605 0.011299435
0.004070556 0.005649718 0.011299435
0.002713704 0.003389831 0.005649718
0.001356852 0.001129944 0.005649718
0.001356852 0.001129944 0.005649718
0.001356852 0.001129944 0.005649718
NA 0.001129944 NA
NA 0.001129944 NA
NA 0.001129944 NA
NA 0.001129944 NA
NA 0.001129944 NA
NA 0.001129944 NA
NA 0.001129944 NA"
, header = TRUE)
Я свел ваши данные в аккуратный формат, а затем использовал geom_col()
, Я должен был преобразовать y
ось к factor
переменная для того, чтобы барплот показал фактическую идентичность значений. Вы также можете использовать geom_bar(stat = "identity")
,
# double check that these values are correct, I wrote this quickly
A <- c(0.868385346
,0.07626866
,0.024423338
,0.017639077
,0.004070556
,0.004070556
,0.002713704
,0.001356852
,0.001356852
,0.001356852
,NA
,NA
,NA
,NA
,NA
,NA
,NA)
B <- c(0.628248588
,0.277966102
,0.057627119
,0.007909605
,0.007909605
,0.005649718
,0.003389831
,0.001129944
,0.001129944
,0.001129944
,0.001129944
,0.001129944
,0.001129944
,0.001129944
,0.001129944
,0.001129944
,0.001129944)
C <- c(0.468926554
,0.271186441
,0.203389831
,0.011299435
,0.011299435
,0.011299435
,0.005649718
,0.005649718
,0.005649718
,0.005649718
,NA
,NA
,NA
,NA
,NA
,NA
,NA)
# combine all three vectors into a dataframe
df_wide <- data.frame(A,B,C)
# convert to tidy format
df <- gather(df_wide, id, value) %>% na.omit()
# create our plot
ggplot(df, aes(x = as.factor(id), y = as.factor(value), fill = id)) +
geom_bar(position = "dodge", stat = "identity")