R - Бар График с прозрачностью на основе значений? - PullRequest
1 голос
/ 17 марта 2020

У меня есть набор данных myData, который содержит значения x и y для различных Samples. Я могу создать линейный график для набора данных, который содержит несколько образцов со следующим псевдокодом, и это хороший способ представить эти данные:

myData <- data.frame(x = 290:450, X52241 = c(..., ..., ...), X75123 = c(..., ..., ...))
myData <- myData %>% gather(Sample, y, -x)
ggplot(myData, aes(x, y)) + geom_line(aes(color=Sample))

, который генерирует:

Line plot of absorbance data

Это превращается в Спагетти-сюжет , когда у меня добавлено намного больше образцов, что затрудняет понимание информации, поэтому я хочу представлять "холмы" «каждого образца по-другому. Желательно, чтобы я представлял данные в виде ряда сгруппированных столбцов, по одному для каждого myData$Sample, с прозрачностью, обратно связанной с тем, что находится в myData$y. Я пытался представить эти данные в фотошопе (плохо) здесь:

What I would like to make

Есть ли способ сделать это? Создание граненых графиков с использованием facet_wrap() или facet_grid() не дает мне того, что я хочу (слишком много образцов). Я также был бы открыт для суммированных графиков с ребрами с использованием ggridges, но я не понимаю, как я смогу преобразовать абсолютные значения в stat(density) значение, необходимое для их построения.

Есть предложения?

1 Ответ

0 голосов
/ 18 марта 2020

Спасибо u / Joris за полезное предложение! Поскольку я не нашел этот вопрос в другом месте, я go опубликую и опубликую довольно простое решение моего вопроса здесь, чтобы другие могли его найти.

По сути, мне нужно было применить альфа-эстетику c через aes(alpha=y, ...). Теоретически я мог бы применить это к любому геому. Я попробовал geom_col(), что сработало, но лучшим решением было использовать geom_segment(), так как все мои "бары" должны были быть одинаковой длины. Также обратите внимание, что мне пришлось «нарезать» сегменты, чтобы избежать проблемы переполнения, подобной тем, которые были найдены здесь , здесь и здесь .

ggplot(myData, aes(x, Sample)) +
  geom_segment(aes(x=x, xend=x-1, y=Sample, yend=Sample, alpha=y), color='blue3', size=14)

Это дает нам хороший градиент:

enter image description here

Поскольку значения max y не одинаковы для обеих строк, если Я хотел «соответствовать» интенсивности, я нормализовал данные (myDataNorm) и мог сделать тот же график. В моем конкретном случае я предпочел бары, у которых не было градиента, но которые показывали жесткий край для максимальных значений y. Вот одно из решений:

ggplot(myDataNorm, aes(x, Sample)) +
  geom_segment(aes(x=x, xend=x-1, y=Sample, y=end=Sample, alpha=ifelse(y>0.9,1,0)) +
  theme(legend.position='none')

enter image description here

Лучше, но мне не понравились оставленные слабыми участки. Окончательный код - это то, что дало мне то, что идеально отражало то, что я искал. Я просто переместил оператор ifelse(), чтобы применить его к x aestheti c, поэтому части нарисованного сегмента были только теми, у которых были достаточно высокие значения y. Обратите внимание, что мои данные «начинаются» с x = 290 здесь. Вероятно, более элегантные способы объединить эти x и xend термины, но независимо от того:

ggplot(myDataNorm, aes(x, Sample)) +
  geom_segment(aes(
    x=ifelse(y>0.9,x,290), xend=ifelse(y>0.9,x-1,290),
    y=Sample, yend=Sample), color='blue3', size=14) +
  xlim(290,400)  # needed to show entire scale

enter image description here

...