Контурная диаграмма с помощью точечной диаграммы - PullRequest
0 голосов
/ 04 февраля 2019

Точечные диаграммы бесполезны, когда число участков велико.

Так, например, используя нормальное приближение, мы можем получить контурный график.

Мой вопрос: есть липакет для реализации контурного графика из точечного графика. enter image description here


Спасибо @ G5W !!Я могу это сделать !!

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

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

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

plot(x,y, pch=20, col=rainbow(3)[group])

First Attempt - color the groups

Два трюка, которые могут заработать много очковболее понятны:
1. Сделайте точки прозрачными.Густые места будут казаться темнее.И
2. Уменьшите размер точки.

plot(x,y, pch=20, col=rainbow(3, alpha=0.1)[group], cex=0.8)

Transparent points of reduced size

Это выглядит несколько лучше, но не соответствует вашему фактическому запросу.Ваш образец изображения, кажется, показывает эллипсы доверия.Вы можете получить их, используя функцию dataEllipse из пакета car.

library(car)
plot(x,y, pch=20, col=rainbow(3, alpha=0.1)[group], cex=0.8)
dataEllipse(x,y,factor(group), levels=c(0.70,0.85,0.95),
    plot.points=FALSE, col=rainbow(3), group.labels=NA, center.pch=FALSE)

Plot with confidence ellipses

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

plot(x,y,pch=NA)
dataEllipse(x,y,factor(group), levels=c(seq(0.15,0.95,0.2), 0.995),
    plot.points=FALSE, col=rainbow(3), group.labels=NA, 
    center.pch=FALSE, fill=TRUE, fill.alpha=0.15, lty=1, lwd=1)

Density plot

Вы можете получить более непрерывный вид, построив график болееэллипсы и опуская границы.

plot(x,y,pch=NA)
dataEllipse(x,y,factor(group), levels=seq(0.11,0.99,0.02),
    plot.points=FALSE, col=rainbow(3), group.labels=NA, 
    center.pch=FALSE, fill=TRUE, fill.alpha=0.05, lty=0)

Smoother density plot

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


Дополнительный ответ на комментарий: Добавление меток
Пожалуй, наиболее естественным местом для добавления меток групп являются центры эллипсов.Вы можете получить это, просто вычислив центроиды точек в каждой группе.Так, например,
plot(x,y,pch=NA)
dataEllipse(x,y,factor(group), levels=c(seq(0.15,0.95,0.2), 0.995),
        plot.points=FALSE, col=rainbow(3), group.labels=NA,
    center.pch=FALSE, fill=TRUE, fill.alpha=0.15, lty=1, lwd=1)

## Now add labels
for(i in unique(group)) {
    text(mean(x[group==i]), mean(y[group==i]), labels=i) 
}

Labeled Ellipses

Обратите внимание, что я просто использовал номер в качестве метки группы, но если у вас есть более сложное имя, выможет изменить labels=i на что-то вроде labels=GroupNames[i].



Данные

x = c(rnorm(2000,0,1), rnorm(7000,1,1), rnorm(11000,5,1))
twist = c(rep(0,2000),rep(-0.5,7000), rep(0.4,11000))
y = c(rnorm(2000,0,1), rnorm(7000,5,1), rnorm(11000,6,1)) + twist*x
group = c(rep(1,2000), rep(2,7000), rep(3,11000))
0 голосов
/ 04 февраля 2019

Вы можете использовать hexbin::hexbin(), чтобы показать очень большие наборы данных.

@ G5W дал хороший набор данных:

x = c(rnorm(2000,0,1), rnorm(7000,1,1), rnorm(11000,5,1))
twist = c(rep(0,2000),rep(-0.5,7000), rep(0.4,11000))
y = c(rnorm(2000,0,1), rnorm(7000,5,1), rnorm(11000,6,1)) + twist*x
group = c(rep(1,2000), rep(2,7000), rep(3,11000))

Если вы не знаете информацию о группе, то эллипсы неуместны;вот что я бы посоветовал:

library(hexbin)
plot(hexbin(x,y))

, который выдает

screenshot

Если вам действительно нужны контуры, вам понадобятсяоценка плотности для построения.Функция MASS::kde2d() может ее создать;см. примеры на его странице справки для построения контура на основе результата.Вот что он дает для этого набора данных:

library(MASS)
contour(kde2d(x,y))

screenshot

...