В R возможно ли наложение двух цветов на графике для создания третьего (например, с аддитивным или вычитающим смешением цветов) - PullRequest
20 голосов
/ 25 ноября 2011

Я хотел бы сделать точечный график с 2 категориями данных, одна из которых изображена желтым, а другая синим, и они отображаются зеленым цветом там, где они перекрываются (или в любой другой комбинации). Я обнаружил, что все немного сложнее, даже с прозрачностью. Цвет графика зависит от того, была ли последняя точка на графике синей или желтой.

Например, со следующим кодом:

col1 <- rgb(red = .0, green = 0, blue = 0.8, alpha = 0.8)
col2 <- rgb(red = .8, green = 0.8, blue = 0, alpha = 0.8)
circle <- data.frame(x = c(0.2,0), 
                    y = c(0,0),
                    col = c(col1, col2),
                    stringsAsFactors = F)
orders <- c(1,2)
plot(x = circle$x[orders], y = circle$y[orders],
     col = circle$col[orders], pch = 19, cex = 100, xlab = "", ylab = "")

В зависимости от того, как вы установите вектор orders (который задает, в какую сторону нарисованы две большие точки), вы получите разные результаты: enter image description here

И если вы поменяете местами порядок, в котором вы строите два круга, вы получите: enter image description here

В любом случае, я ожидал смешать цвета, чтобы получить зеленый. Есть ли способ сделать это? Спасибо!

Редактировать - два графика были сделаны с использованием устройства pdf. Я также попытался запустить код через tikzDevice, чтобы увидеть, работает ли это, но это не так.

1 Ответ

5 голосов
/ 25 ноября 2011

В файле справки для устройства pdf () говорится, что настройка по умолчанию для фона является «прозрачной», хотя на практике это не похоже на его поведение, возможно, из-за того, что зрители выбирают белый фон, или, возможно, потому что по умолчанию для графика функция "белая". Средняя часть first становится равным сочетанию белого и зеленого, а вторая second затем добавляется к нему синего цвета. Поэтому я предполагаю, что математика предскажет значение rgb (0,5, 0,5, (0,5 + 0,8) / 2) с последующим смешиванием этой смеси с наложенным цветом. И я думаю, что белый + col1 добавляется в равных пропорциях к значения из col2, что делает математику некоммутативной. В любом случае, конечный результат, вероятно, будет другим, если вы заставите фон «прозрачным». Поведение по умолчанию больше похоже на смешивание красок, чем на сияние театральных огней.

Цветовая модель PDF описана в http://www.adobe.com/devnet/pdf/pdf_reference.html и будет определять, что вы можете ожидать от устройства PDF (но не обязательно, что предоставит зритель).

Я проверил свою теорию о том, что проблема была в белом фоне (и, по-видимому, опровергла его), изменив фон на «черный» в надежде, что не будет добавлено значений к слоистым векторам rgb:

pdf("testfil12rev.pdf", bg="black")
 col1 <- rgb(red = .0, green = 0, blue = 1, alpha = 0.5)
 col2 <- rgb(red = 1, green = 0, blue = 0, alpha = 0.5)
 circle <- data.frame(x = c(0.2,0), 
                     y = c(0,0),
                     col = c(col1, col2),
                     stringsAsFactors = F)
 orders <- c(1,2)
plot(x = circle$x[orders], y = circle$y[orders], bg="black",
      col = circle$col[orders], pch = 19, cex = 100, xlab = "", ylab = "")

 dev.off()

Изменение индикатора 'orders' НЕ приводит к тому же смешанному цвету с черным фоном.

РЕДАКТИРОВАТЬ: Существует предварительная публикация SO с правилами смешивания цветов и альфа: Как рассчитать цвет RGB, указав количество альфа-смешения?

...