Назначьте разные прозрачности и размеры точек на диаграмме рассеяния - PullRequest
1 голос
/ 01 июля 2019

Ниже приведен код, который работает с использованием функции plot () для запуска двумерной диаграммы рассеяния высоты по сравнению с весом, где точки классифицируются как «хорошие», «удовлетворительные», «плохие» в зависимости от того, равно ли значение класса 1, 2. или 3 соответственно. Баллы за «Хорошо»: ярко-зеленый, «Ярмарка», оливково-зеленый и Плохо, красный. Все точки имеют одинаковый размер (pch = 19). Возможно ли иметь разные размеры и прозрачность для каждой точки данных в зависимости от того, какая точка назначена в столбце «Группа»: либо непрозрачная точка и точка малого размера, полупрозрачная и среднего размера, либо точка 100% прозрачной и большой величины , Спасибо за ваши идеи!

  df
  #           Group        Class      Height      Weight
  #  1       Opaque small     1 0.831777874 0.859223152
  #  2 Semi-transprnt med     2 0.751019511 0.807521752
  #  3 Semi-transprnt med     1 0.751019511 0.807521752
  #  4    Transprnt large     3 0.527390539 0.599957241
  #  5    Transprnt large     3 0.527390539 0.599957241

    color <- c(rgb(0, 1, 0, 1), rgb(0.5, 0.5, 0), rgb(1, 0, 0))
    plot(x=c(0.0, 0.5, 0.5, 0.0, 0.0), y=c(0.0, 0.0, 0.5, 0.5, 0.0), 
    type='l', col='gray', lwd=2,xlab='Height', ylab='Weight', 
    xlim=c(1,0), ylim=c(1, 0))
    par(new=T)
    plot(x=c(0.0, 0.5, 0.5, 0.0, 0.0), y=c(0.5, 0.5, 1, 1, 0.5), 
    type='l', col='gray', lwd=2, xlab='', ylab='', 
    xlim=c(1, 0.0), ylim=c(1, 0.0), axes=F)
    par(new=T)
    plot(x=c(0.5, 1, 1, 0.5, 0.5), y=c(0.0, 0.0, 0.5, 0.5, 0.0), 
    type='l', col='gray', lwd=2,
    xlab='', ylab='', xlim=c(1, 0.0), ylim=c(1, 0.0), axes=F)
    par(new=T)
    plot(x=c(0.5, 1, 1, 0.5, 0.5), y=c(0.5, 0.5, 1, 1, 0.5), type='l', 
    col='gray', lwd=2, xlab='', ylab='', 
    xlim=c(1, 0.0), ylim=c(1, 0.0), axes=F)
    par(new=T)
    for (i in 1:3) {
    plot(Height[Class==i], Weight[Class==i], xlim=c(0, 1), ylim=c(0, 1), 
    col=color[i], pch=19, xlab='', ylab='', axes=F)
    par(new=T)
    }
    legend(0.8, 0.586,legend=c('Good', 'Fair', 'Poor'), pch=19, 
    col=color, title='Class')

1 Ответ

0 голосов
/ 02 июля 2019

Вот подход, который добавляет прозрачность, используя метод, описанный в этот ответ (как предложено @ mischva11).Сначала добавьте столбцы, которые содержат требуемые свойства печати:

library(dplyr)
library(tidyr)
library(scales)
df = df %>%
  separate(Group, into = c("Transparency", "Size"), sep = " ") %>%
  mutate(Color = case_when(Class == 1 ~ "Chartreuse",
                           Class == 2 ~ "Olive Drab",
                           Class == 3 ~ "Red"),
         Alpha = case_when(Transparency == "Opaque" ~ 0.9,
                           Transparency == "Semi-transprnt" ~ 0.9,
                           Transparency == "Transprnt" ~ 0.3),
         Size = case_when(Size == "small" ~ 0.8,
                          Size == "med" ~ 1,
                          Size == "large" ~ 1.2))

Замените цикл for в исходном коде следующим:

plot(df$Height, df$Weight, xlim = c(0, 1), ylim = c(0, 1),
     col = df$Color, pch = 21, xlab = "", ylab = "", axes = F,
     cex = df$Size, bg = alpha(df$Color, df$Alpha))

Редактировать: Использование pch = 21 позволяет нам отдельно управлять заливкой и границей точки (col для границы, bg для заливки).В этом примере применяется прозрачность для заливки, но не для границы.

На моем компьютере полупрозрачная точка на самом деле не выглядит очень прозрачной, поэтому это может не совсем соответствовать тому, что вы ищетеза.Вы можете поиграть с альфа-значениями или вместо этого попробовать ggplot.Вот как это делается:

library(dplyr)
library(tidyr)
library(ggplot2)
df = df %>%
  separate(Group, into = c("Transparency", "Size"), sep = " ") %>%
  mutate(Color = case_when(Class == 1 ~ rgb(0, 1, 0),
                           Class == 2 ~ rgb(0.5, 0.5, 0),
                           Class == 3 ~ rgb(1, 0, 0)),
         Alpha = case_when(Transparency == "Opaque" ~ 1,
                           Transparency == "Semi-transprnt" ~ 0.4,
                           Transparency == "Transprnt" ~ 0.2),
         Size = case_when(Size == "small" ~ 1,
                          Size == "med" ~ 2,
                          Size == "large" ~ 4))
ggplot(df, aes(x = Height, y = Weight, col = Color, alpha = Alpha, size = Size)) +
  geom_point() +
  scale_color_identity() +
  scale_alpha_identity()

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

...