#r #windows #macos #ggplot2 #alpha
Вопрос:
Я строю некоторые данные с помощью функции geom_linerange. Это ежедневные наблюдения в течение 5-10 лет в зависимости от набора данных.
При запуске сценария на моем Mac альфа-диапазон строк изменяется в зависимости от количества наблюдений на каждом графике. Однако я хочу, чтобы все графики имели альфа=1. Явная настройка альфа в функции geom_linerange не влияет на график — цвета по-прежнему прозрачны при отображении большого количества наблюдений.
Когда я использовал точно такой же сценарий на своем ноутбуке с Windows, сюжет был правильным с альфой по умолчанию 1.
Ниже приведен минимальный рабочий пример:
library(ggplot2) library(gridExtra) df1 = data.frame(name = c("A","B","C"), Date = rep(seq(as.Date("2010-01-01"),as.Date("2018-01-01"),by=1),each=3), value = runif(8769,-1,1)) df2 = data.frame(name = c("A","B","C"), Date = rep(seq(as.Date("2010-01-01"),as.Date("2014-01-01"),by=1),each=3), value = runif(4386,-1,1)) df3 = data.frame(name = c("A","B","C"), Date = rep(seq(as.Date("2010-01-01"),as.Date("2011-01-01"),by=1),each=3), value = runif(1098,-1,1)) Plot1 = ggplot() geom_linerange(data=df1,aes(x=name,ymin=Date,ymax=Date 1,colour=value),size=15) scale_colour_gradient2(low="red",mid="white",high="blue",midpoint=0,name = "Value") theme_bw() coord_flip() xlab("Driver") ylab("") Plot2 = ggplot() geom_linerange(data=df2,aes(x=name,ymin=Date,ymax=Date 1,colour=value),size=15) scale_colour_gradient2(low="red",mid="white",high="blue",midpoint=0,name = "Value") theme_bw() coord_flip() xlab("Driver") ylab("") Plot3 = ggplot() geom_linerange(data=df3,aes(x=name,ymin=Date,ymax=Date 1,colour=value),size=15) scale_colour_gradient2(low="red",mid="white",high="blue",midpoint=0,name = "Value") theme_bw() coord_flip() xlab("Driver") ylab("") grid.arrange(Plot1,Plot2,Plot3)
Ниже приведен вывод на моем Mac. Верхний участок, с наибольшим количеством наблюдений, имеет самую низкую альфу:
Ниже приведен вывод в моих окнах — как вы можете видеть, все графики имеют альфа=1:
Код передается через репозитории GitHub.
К сожалению, я совершенно не понимаю, почему это происходит. Является ли это ожидаемым поведением на Mac, или я что-то делаю не так?
Большое спасибо!
Комментарии:
1. Я предполагаю, что это из-за сглаживания. У вас больше линий, чем пикселей, с помощью которых их можно построить, поэтому верхний график выглядит размытым/ниже альфа, потому что на вашем устройстве Mac установлено сглаживание, но ваш механизм построения графиков Windows (я предполагаю, что не Cairo или ragg, которые по умолчанию реализуют сглаживание) нет. Самый простой способ получить то, что вы хотите, может заключаться в построении графика с более высоким разрешением или с помощью векторного устройства, такого как svg.
2. @JonSpring Решено! Построение графика с более высоким разрешением, чем ggsave по умолчанию (я установил
dpi=1440
), привело к правильному альфа-значению по желанию. Огромное спасибо. Если вы хотите опубликовать это в качестве ответа, я могу отметить это как решение 🙂
Ответ №1:
Это является результатом взаимодействия между вашими высокочастотными данными и вашим графическим устройством, в частности, его настройкой/возможностью сглаживания. В этом случае мы пытаемся построить график данных за 2900 дней, используя (в моих примерах ниже) только около 600 пикселей ширины графика. С каждым пикселем, представляющим данные примерно за 4 дня, сглаживание дает более «размытый» вид, в то время как построение графика без сглаживания лучше отображает диапазон данных (за счет меньшего количества данных; я предполагаю, что мы фактически видим данные за каждый четвертый день).
В Windows я полагаю, что графическое устройство по умолчанию для окна графика было кварцевым, без сглаживания. Plot1 Plot2 выглядят так с этой настройкой:
Если я включу сглаживание в глобальных настройках RStudio, я получу результат, аналогичный результату вашего Mac, поскольку его графическое устройство по умолчанию использует сглаживание.
Самый простой способ получить то, к чему вы стремитесь, — это увеличить разрешение настолько, чтобы каждый день получать по крайней мере один пиксель; таким образом, вы сможете представлять 100% данных и использовать весь диапазон вашей цветовой шкалы. Вы также можете выводить данные в векторном формате, например svg
, для достижения гораздо более высокого эффективного разрешения.
В качестве альтернативы, в зависимости от характера ваших данных и того, что вы пытаетесь показать, вы можете использовать скользящее среднее значение по дням (я ожидаю, что результат будет похож на результаты сглаживания), или использовать скользящее максимальное или минимальное значение или SD, или какой-либо другой суммарный показатель, который отражает то, что вы хотите более непосредственно, но с более удобоваримой детализацией по времени. Вы также можете рассмотреть другие геометрии (например, линейную диаграмму, точечную диаграмму или график горизонта), которые читателю легче сопоставить со значениями.