Какой хороший способ использовать R для создания диаграммы рассеяния, которая разделяет данные по обработке?


30

Я очень плохо знаком с R и статистикой в ​​целом, но мне нужно составить график рассеяния, который, я думаю, может быть за пределами его собственных возможностей.

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

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

Кто-нибудь знает хороший способ сделать это? Пакеты я должен установить и научиться использовать? Кто-нибудь делал что-то подобное?

Благодарность

Ответы:


53

большие кластеры : если проблема заключается в перепечатке, вы можете использовать более низкую альфу, поэтому отдельные точки тусклые, но при перепечатке цвет становится более интенсивным. Или вы переключаетесь на 2d гистограммы или оценки плотности.

require ("ggplot2")
  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, colour = Species)) + stat_density2d ()
    плотность
    Возможно, вы захотите с этим разобраться ...

  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, fill = Species)) + stat_binhex (bins=5, aes (alpha = ..count..)) + facet_grid (. ~ Species)
    hexbin
    В то время как вы можете проследить этот сюжет также без граней, порядок печати видов влияет на окончательную картину.

  • Этого можно избежать, если вы хотите немного испачкать руки (= ссылка на объяснение и код) и рассчитать смешанные цвета для шестиугольников: введите описание изображения здесь

  • Еще одна полезная вещь - использовать (шестнадцатеричные) контейнеры для областей с высокой плотностью и строить отдельные точки для других частей:

    ggplot (df, aes (x = date, y = t5)) + 
      stat_binhex (data = df [df$t5 <= 0.5,], bins = nrow (df) / 250) +
          geom_point (data = df [df$t5 > 0.5,], aes (col = type), shape = 3) +
      scale_fill_gradient (low = "#AAAAFF", high = "#000080") +
      scale_colour_manual ("response type", 
        values = c (normal = "black", timeout = "red")) + 
      ylab ("t / s")

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


Для полноты построения пакетов позвольте мне также упомянуть lattice:

require ("lattice")
  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Виды, радужная оболочка, pch = 20) </ code>

  • xyplot(Sepal.Width ~ Sepal.Length, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length, iris, groups = iris $ Species, pch = 20) </ code>

  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Виды, радужная оболочка, группы = радужная оболочка $ Виды, pch = 20) </ code>


Прекрасный! Большое спасибо, шестигранные ящики сделали свое дело отлично!
CRF

22

Это одна из классических проблем для набора данных «Iris». Это ссылка на целый набор проектов черчения на основе этого набора данных с кодом R, который вы можете адаптировать к своей проблеме.

Вот подход, который использует базу R, а не дополнительный пакет.

plot(iris$Petal.Length, iris$Petal.Width, pch=21, 
     bg=c("red","green3","blue")[unclass(iris$Species)], 
     main="Edgar Anderson's Iris Data")

который производит эту цифру:

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

Оттуда, в зависимости от вашего графика, вы можете начать возиться с уровнями альфа / прозрачности, чтобы допустить перепланирование и т. Д., Но сначала я бы построил из очень простого графика.

Хотя есть много причин придерживаться базы R, другие пакеты упрощают построение графиков. Разделение данных по отличительной особенности - одна из сильных сторон пакетов ggplot2 и решетчатых . ggplot2 создает особенно визуально привлекательные графики. Оба пакета демонстрируются в ответе @cbeleites.


4
Немного смущает, потому что, хотя вы рекомендуете ggplot2, вы не используете его в своем примере? Эквивалент ggplot2 будет библиотекой (ggplot2); qplot (Petal.Length, Petal.Width, color = Species, data = iris, main = "Данные Ириса Эдгара Андерсона"). Это также имеет преимущество автоматического создания легенды.
Питер Эллис

@PeterEllis Это потому, что хотя я могу распознать что-то, что хорошо подходит для ggplot2, я только до некоторой степени компетентен в базовой графике.
Fomite

1
Отличный трюк с unclass () в базовой графике Кстати
Питер Эллис

16

Или с ggplot2:

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour = Species)) + geom_point()
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + facet_grid(~Species)

Который производит

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.