Несогласованное поведение полигонов с использованием прозрачных цветов

#r

#r

Вопрос:

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

При выполнении следующего кода третий и четвертый фрагменты полигонов будут работать, но первые два — нет (если вы измените border с NULL на color, граница будет отображаться нормально, но заливка не будет).

 var1 = c(10.13981, 11.47067, 11.07515, 11.32449, 11.57041, 11.75539, 10.81107, 10.90303, 10.47502,
         10.90169, 11.38179, 10.05446, 10.72442, 10.68973, 12.31730, 13.16385, 12.02199, 10.91423,
         11.54465, 10.80909)

var2 = c(116.0, 100.0, 117.0, 116.0, 112.0, 125.5, 110.0, 103.0,  94.0, 105.0, 97.0, 131.0, 108.5,  95.0, 96.0,  78.0,  89.0, 103.0,  99.0,  90.0)

plot(var2~var1)

#What I want to draw
polygon(
  x = c(seq(9,15,0.1), rev(seq(9,15,0.1))),
  y = c(rep(120,61), rep(100,61)),
  col = adjustcolor(col = 'grey', alpha.f = 0.5),
  border = NA
)

#checking if replacing "adjustcolor" with the output of the function works
polygon(
  x = c(seq(9,15,0.1), rev(seq(9,15,0.1))),
  y = c(rep(120,61), rep(100,61)),
  col = "#BEBEBE1A",
  border = NA
)

#works just fine if alpha.f is set to 1 (fully opaque)
polygon(
  x = c(seq(9,15,0.1), rev(seq(9,15,0.1))),
  y = c(rep(120,61), rep(100,61)),
  col = adjustcolor(col = 'grey', alpha.f = 1),
  border = NA
)

#works just fine with transparency using different x/y values
polygon(
  x = c(11,11,12,12),
  y = c(110,120,120,110),
  col = adjustcolor(col = 'grey', alpha.f = .1),
  border = NA
)

 

По сути, определенные комбинации переменных x / y и значений alpha.f приведут к тому, что заливка полигонов просто не будет работать.

Для меня это не имеет никакого смысла. Я упускаю что-то очевидное? Это сводит меня с ума.

добавление скриншотов моих результатов с использованием различных кодов полигонов (изменил все границы на «черные»):

#1введите описание изображения здесь

#2 введите описание изображения здесь

#3введите описание изображения здесь

#4введите описание изображения здесь

Комментарии:

1. Я протестировал его, изменил границы и заливки, и все полигоны были нарисованы правильно. Не могли бы вы добавить скриншот вашего графика?

2. Отредактировано, чтобы добавить скриншоты всех 4 версий полигонов.

3. Спасибо. Я смог воспроизвести это и обнаружил, что только в локальном R существует эта проблема. На моем сервере RStudio графики отображаются правильно. Я не могу это решить, но, возможно, эта информация поможет другим узнать, что происходит. Редактировать, здесь это работает также правильно: tutorialspoint.com/execute_r_online.php

4. Ваше предложение заставило меня попробовать выполнить различные экспортные операции графика. Использование png () и jpeg () по-прежнему не работало, но оно работало с использованием pdf (), так что, похоже, это, вероятно, проблема с графическим устройством?

Ответ №1:

При поиске предстоящих изменений на странице R выясняется, что это известная ошибка, когда полигон рисуется за пределами области построения с помощью полупрозрачных заливок в графических устройствах Windows. Оно помечено как «исправленное», но, по-видимому, еще не реализовано. Надеюсь, это появится относительно скоро.

Ответ №2:

Выяснилось, что это ошибка только для Windows, если полигон больше графика.

Ссылки:

Тем временем вы могли бы найти обходной путь:

 var1 = c(10.13981, 11.47067, 11.07515, 11.32449, 11.57041, 11.75539, 10.81107, 10.90303, 10.47502,
         10.90169, 11.38179, 10.05446, 10.72442, 10.68973, 12.31730, 13.16385, 12.02199, 10.91423,
         11.54465, 10.80909)

var2 = c(116.0, 100.0, 117.0, 116.0, 112.0, 125.5, 110.0, 103.0,  94.0, 105.0, 97.0, 131.0, 108.5,  95.0, 96.0,  78.0,  89.0, 103.0,  99.0,  90.0)

par(mfrow=c(2,2))
plot(var2~var1)


polygon(
  x = c(seq(min(var1),max(var1),0.1), rev(seq(min(var1),max(var1),0.1))),
  y = c(rep(120, length(seq(min(var1),max(var1),0.1))), rep(100,length(seq(min(var1),max(var1),0.1)))),
  col = adjustcolor(col = 'grey', alpha.f = 0.5),
  border=NA
)
 

Вывод:
введите описание изображения здесь

редактировать: о, только что понял, что вы также нашли описание ошибки.