Участок скрипки со странной формой

#r #ggplot2 #violin-plot

#r #ggplot2 ( ggplot2 ) #скрипка-сюжет #ggplot2 #график скрипки

Вопрос:

Я хочу сравнить распределение нескольких измерений технологизации с использованием графиков violin (размеры измеряются индексами в диапазоне от 1 до 5). 5 из 6 графиков скрипки выглядят так, как и следовало ожидать, но один имеет действительно странную форму, которая не отражается в данных. Поэтому мне интересно, есть ли какое-либо объяснение этому. Я покажу вам таблицы переменных, код, который я использовал для создания графика, и сам график. Если вам нужна дополнительная информация, не стесняйтесь спрашивать.

Таблицы:

 > table(dat$cps_an, useNA="ifany")   # CPS-Anlagen

                0             0.625 0.833333333333333              1.25  1.66666666666667             1.875               2.5             3.125              3.75             4.375 
               22                21                 3                20                 4                18                19                15                 5                 1 
                5              <NA> 
                2                 5 
> table(dat$cps_prod, useNA="ifany")   # CPS-Produkte

                0             0.625 0.833333333333333              1.25  1.66666666666667             1.875               2.5             3.125  3.33333333333333              3.75 
                3                 8                 1                28                 3                33                38                13                 3                 3 
            4.375 
                2 
> table(dat$cpps, useNA="ifany")   # Produktionssysteme

                0 0.333333333333333                 1  1.16666666666667               1.5              1.75                 2               2.5  2.66666666666667  2.83333333333333 
                2                 1                 2                 2                 1                 1                11                 3                 2                 9 
                3  3.16666666666667  3.33333333333333               3.5  3.66666666666667              3.75  3.83333333333333  4.16666666666667  4.33333333333333  4.66666666666667 
                9                 2                22                 1                 3                 2                 9                28                 1                 6 
                5              <NA> 
               13                 5 
> table(dat$mobile, useNA="ifany")   # Mobile Devices

               0 1.66666666666667              2.5 3.33333333333333             3.75 4.16666666666667                5 
               3               29                4                2                3               34               60 
> table(dat$strat, useNA="ifany")   # Strategie und Organisation

               0            0.625             1.25 1.66666666666667            1.875              2.5            3.125 3.33333333333333             3.75            4.375                5 
               1                3                3                2               11               34               38                3               11                8                5 
            <NA> 
              16 
> table(dat$index, useNA="ifany")   # Gesamt-Index

0.485416666666667             0.975  1.25104166666667           1.30625  1.31979166666667  1.33958333333333  1.82604166666667  1.86041666666667  1.93854166666667  2.00416666666667 
                1                 1                 1                 1                 1                 1                 1                 1                 1                 1 
 2.04791666666667  2.06354166666667  2.15104166666667  2.16666666666667            2.1875          2.203125  2.23541666666667  2.26041666666667  2.30104166666667          2.303125 
                1                 1                 1                 2                 1                 1                 1                 1                 1                 1 
 2.31666666666667  2.33854166666667          2.353125  2.36041666666667  2.38541666666667          2.390625  2.39479166666667          2.415625  2.43854166666667          2.453125 
                2                 1                 1                 1                 1                 1                 1                 1                 1                 1 
 2.47916666666667  2.54479166666667            2.5625           2.56875          2.584375  2.58854166666667  2.60416666666667  2.62604166666667           2.65625          2.671875 
                1                 1                 1                 1                 1                 1                 1                 1                 1                 2 
           2.6875  2.69166666666667  2.70416666666667          2.728125              2.75           2.75625  2.78541666666667  2.81354166666667          2.828125           2.84375 
                1                 1                 1                 1                 1                 1                 1                 1                 1                 1 
          2.86875  2.86979166666667             2.875  2.88541666666667            2.9125  2.91666666666667  2.94270833333333          2.953125  2.95833333333333          2.959375 
                1                 1                 1                 1                 1                 1                 1                 1                 1                 1 
 2.96354166666667           2.96875          2.984375  2.99791666666667          3.015625           3.03125  3.03541666666667          3.046875  3.05104166666667  3.05729166666667 
                1                 1                 1                 1                 1                 3                 1                 2                 1                 1 
         3.078125  3.07916666666667  3.08854166666667           3.09375  3.11666666666667             3.125          3.140625  3.16979166666667  3.17604166666667            3.1875 
                1                 1                 1                 1                 1                 2                 1                 1                 1                 1 
         3.209375            3.2125          3.228125              3.25  3.26041666666667          3.290625          3.296875           3.30625  3.32291666666667          3.328125 
                1                 1                 1                 1                 1                 1                 1                 1                 1                 1 
            3.375  3.43229166666667  3.44791666666667  3.47916666666667  3.58854166666667  3.64166666666667  3.72291666666667  3.80104166666667          3.859375  3.96354166666667 
                2                 2                 1                 1                 1                 1                 1                 1                 1                 1 
         3.984375  4.15833333333333            4.1875           4.30625              <NA> 
                1                 1                 1                 1                22 
  

Код для графиков скрипки:

 technologie_df <- data.frame(group=c(rep("CPS: Anlagen", nrow(dat)),
                                     rep("CPS: Produkte", nrow(dat)),
                                     rep("Produktionssysteme", nrow(dat)),
                                     rep("Mobile Devices", nrow(dat)),
                                     rep("Strategie und Organisation", nrow(dat)),
                                     rep("Gesamt-Index", nrow(dat))),
                             value=c(dat$cps_an, dat$cps_prod, dat$cpps, dat$mobile, dat$strat, dat$index))
technologie_df <- na.omit(technologie_df)

technologie_plot <- ggplot(technologie_df, aes(x=group, y=value, fill=group))  
  geom_violin()  
  labs(y="Index-Wert")  
  scale_x_discrete(limits=c("CPS: Anlagen", "CPS: Produkte", "Produktionssysteme", "Mobile Devices", "Strategie und Organisation", "Gesamt-Index"))  
  scale_fill_manual(values=c("#003560","#8DAE10","#8DAE10","#8DAE10","#003560","#003560"))  
  theme(axis.title.x = element_blank(),
        panel.background = element_blank(),
        axis.line = element_line(colour="black"),
        legend.position = "none")
ggsave(file.path(path_out,"ViolinPlot_Technologie.png"), plot=technologie_plot, type="cairo-png")
  

И сам сюжет:

Графики скрипки

Сюжет, который меня, конечно, раздражает, — это сюжет «Strategie und Organization», поскольку его форма не соответствует данным. Если вы посмотрите на таблицу, там 34 человека с рейтингом 2.5 и 38 человек с рейтингом 3.125. Между ними нет значения, в котором меньше людей, которые могли бы объяснить разрыв между 2.5 и 3.125 в графике. То же самое относится и к большинству других пробелов. На других графиках нет этих пробелов. Есть ли этому объяснение?

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

1. У 5-й скрипки, вероятно, есть дискретные данные, и мое предложение состоит в том, чтобы увеличить пропускную способность части оценки плотности ядра, т. Е. geom_violin(..., adjust = 2)

2. Ваши данные сильно дискретизированы, поэтому кривые плотности часто страдают в зависимости от ширины ядра, используемой для плотности. Изменение ширины ядра поможет немного сгладить это. В ?geom_violin нем предлагается прочитать ?density параметры ядра. (Кстати, предоставление нам table(...) ваших данных действительно нехорошо, гораздо лучше просто использовать dput для всего кадра.)

3. Кстати, ваш метод преобразования из широкого формата в длинный является творческим, но, возможно, более подвержен ошибкам пользователя. Альтернативы (которые являются более гибкими, если у вас есть что-то еще) включают в себя: tidyr::pivot_longer(dat, everything(), names_to = "group", values_to = "value") и data.table::melt(data.table::as.data.table(dat), variable.name = "group") . В этом случае он делает то же самое, что и вы, но без необходимости перекодировать, если / когда вы добавляете / удаляете столбцы и / или меняете их порядок.

4. Подход к изменению параметра настройки сработал. Большое вам спасибо. Я также попробую альтернативный стиль преобразования.

5. если вы получили решение из комментариев @r2evans, я бы посоветовал вам опубликовать ответ (я думаю, вам придется подождать несколько часов, чтобы ответить самостоятельно; это также позволяет комментаторам публиковать свои комментарии в качестве ответа, если им этого захочется)

Ответ №1:

Если вы хотите, чтобы ваш график скрипки подчеркивал дискретный характер данных, вы можете установить adjust в geom_violin() небольшое значение:

 ggplot(dat)  
  geom_violin(aes(x = "Strategie und Organisation", y = strat), adjust = 0.1)
  

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

Если вы хотите, чтобы график скрывал дискретный характер данных, установите adjust большее значение.

 ggplot(dat)  
  geom_violin(aes(x = "Strategie und Organisation", y = strat), adjust = 1.5)
  

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

Вот данные, основанные на сообщении OP.

 dat <- data.frame(strat = c(0, rep(0.625, 3), 
                          rep(1.25, 3), 
                          rep(5/3, 2), 
                          rep(1.875, 11),
                          rep(2.5, 34),
                          rep(10/3, 3),
                          rep(3.75, 11),
                          rep(4.375, 8),
                          rep(5, 5)))
  

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

1. Вау, хороший сбор данных. Можете ли вы также включить данные?