Заказ наборов вручную в R / Venn

Я использую VennDiagram, чтобы проиллюстрировать перекрытие между отдельными группами клиентов - в целом и для определенного подсегмента. Проблема, с которой я столкнулся, заключается в том, что, похоже, VennDiagram автоматически упорядочивает круги в выводе от наибольшего к наименьшему. На двух диаграммах, которые я создаю, относительный размер двух популяций переворачивается, поэтому на выходе популяции / цвета диаграммы меняются местами. Я хочу разместить их рядом в документе, и изменение порядка населения делает параллельное сравнение немного запутанным.

Пример кода для каждого из них приведен ниже - есть ли способ вручную принудительно упорядочить наборы в выходных данных, чтобы совокупности были упорядочены в той же последовательности?

Спасибо -

venn.plot <- venn.diagram(
x = list(
"AD" = 1:703814,
"WM" = 672279:1086933
),
height = 4000 ,
width = 4000 ,
units = 'px',
filename = "H:\\AD_vs_WM_Total.tiff",
scaled = TRUE,
ext.text = TRUE,
lwd = 1, 
ext.line.lwd = 1,
ext.dist = -0.15,
ext.length = 0.9,
ext.pos = -4,
fill = c("cornflowerblue", "darkorchid1"),
cex = 1.5,
cat.cex = 2,
cat.col = c("black", "black"),
cat.pos = c(120,300) ,
rotation.degree = 45,
main = "AD vs. WM",
sub = "Total Populations",
main.cex = 2,
sub.cex = 1.5
);

venn.plot <- venn.diagram(
x = list(
"AD" = 1:183727,
"WM" = 173073:383052
),
height = 4000 ,
width = 4000 ,
units = 'px',
filename = "H:\\AD_vs_WM_Target.tiff",
scaled = TRUE,
ext.text = TRUE,
lwd = 1, 
ext.line.lwd = 1,
ext.dist = -0.15,
ext.length = 0.9,
ext.pos = -4,
fill = c("cornflowerblue", "darkorchid1"),
cex = 1.5,
cat.cex = 2,
cat.col = c("black", "black"),
cat.pos = c(120,300) ,
rotation.degree = 45,
main = "AD vs. WM",
sub = "Target Populations",
main.cex = 2,
sub.cex = 1.5
);

person MStu    schedule 15.05.2014    source источник


Ответы (4)


используйте оператор if, чтобы увидеть, больше ли второй набор, чем первый. если да, то добавьте к повороту 180 градусов.

person Alan B    schedule 28.08.2014

Это можно решить, изменив объект gList из функции draw.pairwise.venn(). venn.diagram() - это оболочка для многих draw.____.venn() функций (например: pairwise, quad, quintuple, single и т. Д.)

Используйте оператор if, чтобы найти какой-либо переключатель в метках населения в вашем примере. Если это правда, измените inverted = TRUE и переключите метки.

Также используйте ind = FALSE, чтобы предотвратить рисование диаграммы.

Я использовал ваш пример, чтобы показать решение для одной из двух диаграмм Венна, которые вы разместили в своем вопросе.

packageVersion("VennDiagram")
# [1] ‘1.6.17’

AD <-  1:703814
WM <-  672279:1086933
overlap <- calculate.overlap(x = list('AD' = AD, 'WM' = WM))
area_overlap <- sapply(overlap, length)

g <- draw.pairwise.venn(area1 = area_overlap[1],
                        area2 = area_overlap[2],
                        cross.area = area_overlap[3],
                        category = c("AD", "WM"),
                        ind = FALSE,
                        inverted = FALSE,
                        scaled = TRUE,
                        ext.text = TRUE,
                        lwd = 1, 
                        ext.line.lwd = 1,
                        ext.dist = -0.15,
                        ext.length = 0.9,
                        ext.pos = -4,
                        fill = c("cornflowerblue", "darkorchid1"),
                        cex = 6,
                        cat.cex = 6,
                        cat.col = c("black", "black"),
                        cat.dist = c(-0.16, -0.09),
                        cat.pos = c(0,10),
                        rotation.degree = 35)

# check for switch in labels
if(area_overlap[1] != (as.integer(g[[5]]$label) + as.integer(g[[7]]$label)) && area_overlap[2] !=  (as.integer(g[[6]]$label) + as.integer(g[[7]]$label))){
  # change inverted to TRUE
  g <- draw.pairwise.venn(area1 = area_overlap[1],
                          area2 = area_overlap[2],
                          cross.area = area_overlap[3],
                          category = c("AD", "WM"),
                          ind = FALSE,
                          inverted = TRUE,
                          scaled = TRUE,
                          ext.text = TRUE,
                          lwd = 1, 
                          ext.line.lwd = 1,
                          ext.dist = -0.15,
                          ext.length = 0.9,
                          ext.pos = -4,
                          fill = c("cornflowerblue", "darkorchid1"),
                          cex = 6,
                          cat.cex = 6,
                          cat.col = c("black", "black"),
                          cat.dist = c(-0.16, -0.09),
                          cat.pos = c(0,10),
                          rotation.degree = 35)

  # switch labels
  tmp_var      <- g[[6]]$label
  g[[6]]$label <- g[[5]]$label
  g[[5]]$label <- tmp_var
  rm(tmp_var)
}

jpeg("AD_vs_WM_Total_new.jpg", width = 1200, height = 1200)
plot.new()
title(main = "AD vs. WM", sub = "Total Populations", cex.main = 6, cex.sub = 5, line = -4, outer = TRUE)
grid.draw(g)
dev.off()

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

person Sathish    schedule 07.12.2016

Оператор if сделает свое дело, но, похоже, для такой небольшой задачи он кажется немного тяжелым. Я думаю, вы могли бы просто добавить в свой скрипт следующую строку

inverted=length(x$AD) < length(x$WM)

И это должно помочь (когда WM длиннее, чем оператор AD имеет значение True и график инвертирован).

person user2764233    schedule 02.04.2015

У меня это не сработало. Данные в кружках перевернулись, но метки на кружках остались на своих местах. Однако подход rotation сработал.

person user3424407    schedule 08.07.2015