#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. Вау, хороший сбор данных. Можете ли вы также включить данные?