Наиболее недоиспользуемая визуализация данных [закрыто]

178

Гистограммы и диаграммы рассеяния являются отличными методами визуализации данных и взаимосвязи между переменными, но недавно мне стало интересно, какие методы визуализации мне не хватает. Какой, по вашему мнению, самый недоиспользуемый тип сюжета?

Ответы должны:

  1. Не очень часто используется на практике.
  2. Быть понятным без большого количества второстепенного обсуждения.
  3. Быть применимым во многих общих ситуациях.
  4. Включите воспроизводимый код для создания примера (желательно в R). Связанное изображение было бы хорошо.
Ян Феллоуз
источник
13
Я думаю, что это очень полезная дискуссия, и мне грустно, что она закрыта.
Алекс Браун
2
@AlexBrown: тогда почему бы не проголосовать за открытие? Я могу понять, почему формулировка этого вопроса может показаться «неконструктивной», но этот вопрос привел к некоторым наиболее вдумчивым и проницательным ответам на эту тему в Интернете. Я хотел бы видеть эти ответы обновленными и расширенными.
максимум
2
Это, вероятно, следует перенести на stats.stackoverflow.com. Это гораздо больше подходит для этого сайта.
naught101
4
Жаль, что никто не упомянул QQ-графики здесь до того, как это было закрыто. Они так чертовски полезны!
naught101
Это должно быть повторно открыто.
Питер Флом

Ответы:

89

Я действительно согласен с другими постерами: книги Туфте фантастические и их стоит прочитать.

Во-первых, я хотел бы указать вам очень хороший учебник по ggplot2 и ggobi из «Просмотр данных» в начале этого года. Кроме того, я бы выделил одну визуализацию из R и два графических пакета (которые не так широко используются, как базовая графика, решетка или ggplot):

Тепловые карты

Мне очень нравятся визуализации, которые могут обрабатывать многомерные данные, особенно данные временных рядов. Тепловые карты могут быть полезны для этого. Дэвид Смит (David Smith) опубликовал один действительно интересный блог в блоге Revolutions . Вот код ggplot, предоставленный Хэдли:

stock <- "MSFT"
start.date <- "2006-01-12"
end.date <- Sys.Date()
quote <- paste("http://ichart.finance.yahoo.com/table.csv?s=",
                stock, "&a=", substr(start.date,6,7),
                "&b=", substr(start.date, 9, 10),
                "&c=", substr(start.date, 1,4), 
                "&d=", substr(end.date,6,7),
                "&e=", substr(end.date, 9, 10),
                "&f=", substr(end.date, 1,4),
                "&g=d&ignore=.csv", sep="")    
stock.data <- read.csv(quote, as.is=TRUE)
stock.data <- transform(stock.data,
  week = as.POSIXlt(Date)$yday %/% 7 + 1,
  wday = as.POSIXlt(Date)$wday,
  year = as.POSIXlt(Date)$year + 1900)

library(ggplot2)
ggplot(stock.data, aes(week, wday, fill = Adj.Close)) + 
  geom_tile(colour = "white") + 
  scale_fill_gradientn(colours = c("#D61818","#FFAE63","#FFFFBD","#B5E384")) + 
  facet_wrap(~ year, ncol = 1)

Что в итоге выглядит примерно так:

альтернативный текст

RGL: интерактивная 3D-графика

Еще один пакет, который стоит того, чтобы его изучить, - это RGL , который легко предоставляет возможность создавать интерактивную трехмерную графику. Для этого есть много примеров (в том числе в документации по rgl).

В R-Wiki есть хороший пример того, как строить трехмерные диаграммы рассеяния, используя rgl.

GGobi

Другой пакет, который стоит знать, это rggobi . Существует книга Springer по этому вопросу , а также множество отличных документов / примеров в Интернете, в том числе на курсе «Просмотр данных» .

Шейн
источник
отлично. Спасибо за включение кода / изображения.
Ян Феллоуз
на что указывает вертикальное положение Z или изгиба в каждой сплошной черной вертикальной линии?
Даг
Это месячные границы (месяцы не заканчиваются в один и тот же день).
Шейн
3
Это красиво. Как вы получили границы месяца?
Алекс Браун
58

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

Вот пример из Quick-R: точечный сюжет по данным автомобиля

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

В следующем примере (сделано в Excel всего!), Вы можете ясно увидеть, какая категория могла пострадать от замены метки.

Дотплот с 2 группами

Ари Б. Фридман
источник
1
Чем точечная диаграмма отличается от точечной диаграммы с переключаемой осью, одна из которых является категориальной?
DrSAR
4
@DrSAR Чем гистограмма отличается от диаграммы, или график плотности отличается от линейного графика? Вы можете описать многие стандартные типы диаграмм в терминах более фундаментальных геометрических форм (см. Semiologie Graphique Бертина ), но это не делает понимание того, что можно придумать что-то определенное, менее уникальное. В этом случае вы строите две части категориальной информации (одну по вертикали, другую по форме символа построения графика) относительно одной части непрерывных данных. В то время как в большинстве пакетов программного обеспечения вы взламываете диаграмму рассеяния, чтобы создать ее, она, безусловно, не является диаграммой рассеяния.
Ари Б. Фридман
2
@ gsk3 Не хочу казаться странным. На самом деле, я теперь (после прочтения большего количества грамматики графики и подобных работ) осознаю, что это различие более высокого уровня может быть весьма важным для представления. Спасибо за показ этого.
DrSAR
@DrSAR И я не хотел показаться оборонительным. Природа SO комментариев, я думаю ;-)
Ари Б. Фридман
56

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

Я думаю, это потому, что иногда ваши данные по своей природе являются скорее полярными, чем линейными - например, они циклические (координаты x представляют время в течение 24-часового дня в течение нескольких дней), или данные ранее были отображены в пространстве полярных объектов.

Вот пример. Этот график показывает средний объем трафика на сайте в час. Обратите внимание на два всплеска в 10 часов вечера и в 1 час ночи. Для сетевых инженеров Сайта это важно; Также важно, что они происходят рядом друг с другом (всего два часа друг от друга). Но если вы нанесете те же данные на традиционную систему координат, этот шаблон будет полностью скрыт - нанесенный линейно, эти два всплеска будут на расстоянии 20 часов друг от друга, хотя они также на расстоянии всего два часа в последовательные дни. Полярная диаграмма выше показывает это экономно и интуитивно (легенда не нужна).

Полярная диаграмма, показывающая посещаемость сайта, с пиками в часы 1 и 22

Есть два способа (о которых я знаю) для создания графиков, подобных этому, используя R (я создал график выше w / R). Одним из них является кодирование вашей собственной функции в базовых или сеточных графических системах. Другим способом, который проще, является использование круглой упаковки . Функция, которую вы бы использовали - это rose.diag :

data = c(35, 78, 34, 25, 21, 17, 22, 19, 25, 18, 25, 21, 16, 20, 26, 
                 19, 24, 18, 23, 25, 24, 25, 71, 27)
three_palettes = c(brewer.pal(12, "Set3"), brewer.pal(8, "Accent"), 
                   brewer.pal(9, "Set1"))
rose.diag(data, bins=24, main="Daily Site Traffic by Hour", col=three_palettes)
дуг
источник
4
Скопировав ваш код, я получаю совсем другой сюжет (это довольно некрасиво); есть идеи почему? Я получаю это предупреждение: 1: В as.circular (xx [, 1]): объект приводится к классу 'циркулярный', используя значение по умолчанию для следующих компонентов: тип: единицы измерения углов: 'радианы' шаблон: ' нет 'modulo:' asis 'ноль: 0 вращение:' counter 'rose.diagdata24Daily Трафик сайта от Hourthree_palettes
дата данных
У меня та же проблема.
crayola
Вы можете сделать это с помощью линейного сюжета тоже. Может быть немного сложнее для чтения, но это также может быть действительно здорово для более детализированных данных или данных, которые подвергаются более чем одному циклу (например, построить десять циклов, а затем построить их среднее значение).
naught101
1
У меня также были проблемы с копированием сюжета. В конце концов я решил, что проще использовать ggplot2. Я оставил короткую демонстрацию по Rpubs с кодом и результатами: rpubs.com/mattbagg/circular
MattBagg
1
Эквивалент ggplot2:qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar()
naught101
54

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

library(mlbench) ## this package has a smiley function
n <- 1e5 ## number of points
p <- mlbench.smiley(n,sd1 = 0.4, sd2 = 0.4) ## make a smiley :-)
x <- p$x[,1]; y <- p$x[,2]
par(mfrow = c(1,2)) ## plot side by side
plot(x,y) ## left plot, regular scatter plot
smoothScatter(x,y) ## right plot, smoothed scatter plot

hexbinПакет (предложенный @Dirk Eddelbuettel) используется для тех же целей, но smoothScatter()имеет то преимущество , что она принадлежит к graphicsпакету, и, таким образом , часть стандартной установки R.

Смайлик как обычный или сглаженный разброс

nullglob
источник
6
Для полноты картины вы также можете получить этот эффект в ggplot, используя прозрачность (альфа). В сочетании с точкой geom.
Пол Химстра
1
это то же самое, что оценка плотности ядра, или просто похоже?
эндолит
30

Что касается спарклайна и других идей Tufte, пакет YaleToolkit на CRAN предоставляет функции sparklineи sparklines.

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

Дирк Эддельбюттель
источник
4
+1 к спарклайнам. В настоящее время я работаю над пакетом, который ориентирован на создание спарклайнов в R - они делают отличные дополнения к таблицам в отчетах Sweave.
Шарпи
1
Прохладно! Я не слишком доволен тем, что есть у Джея в YaleToolkit, и хотел бы, чтобы в таблицах были спарклайны!
Дирк Эддельбюттель
Я только что задокументировал способ производства спарклайнов, используя только plotover в обновлении моего вопроса , с некоторой помощью из этого сообщения на форуме
Ben
1
Hmisc::latex()Версия выхода из Hmisc::describeвключает в себя мини-гистограмму , которая получает включена в таблице.
IRTFM
28

Сюжеты для скрипки (которые сочетают в себе блочные графики с плотностью ядра) относительно экзотичны и довольно круты Пакет vioplot в R позволяет вам сделать их довольно легко.

Вот пример (ссылка на Википедию также показывает пример):

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

Джейсон Сундрам
источник
3
Сюжеты для скрипки также доступны через решетку:bwplot(... panel = panel.violin)
Дэвид Дж.
3
Скоро выйдет версия скриптовых сюжетов ggplot2. github.com/wch/ggplot2/wiki/geom_violin
Роман Луштрик
Я не тонкие скрипичные графики настолько полезны, что вместо этого мне нравится показывать все точки с дрожанием.
Nakx
25

Еще одна приятная визуализация временных рядов, которую я только что рассматривал, - это «график ударов» (как показано в этом посте в блоге «Learning R» ). Это очень полезно для визуализации изменений положения с течением времени.

Вы можете прочитать о том, как создать его на http://learnr.wordpress.com/ , но вот как это выглядит:

альтернативный текст

Шейн
источник
Мне действительно нравится график ударов по этим конкретным данным, но мне трудно думать о более общих ситуациях, когда они будут полезны. Тем не менее, я думаю, что мы все можем согласиться, что блог Learning R качает носки.
Ян Феллоуз
7
Диаграмма рельефа представляет собой параллельный координатный график ранжированных данных.
Хэдли
1
это напоминает мне склон, который хорош для представления изменения рейтинга во времени или отношений между рейтингами: charliepark.org/slopegraphs
topchef
21

Мне также нравятся модификации блокпостов Tufte, которые позволяют намного легче сравнивать небольшие кратные, потому что они очень «тонкие» по горизонтали и не загромождают график избыточными чернилами. Тем не менее, он лучше всего работает с довольно большим количеством категорий; если у вас есть только несколько на сюжете, обычные (Тьюки) боксы выглядят лучше, так как они имеют немного больше здоровья.

library(lattice)
library(taRifx)
compareplot(~weight | Diet * Time * Chick, 
  data.frame=cw , 
  main = "Chick Weights",
  box.show.mean=FALSE,
  box.show.whiskers=FALSE,
  box.show.box=FALSE
  )

compareplot

В этом вопросе обсуждаются и другие способы их изготовления (в том числе другой вид бокса Tufte) .

Ари Б. Фридман
источник
@daroczig Спасибо. На днях я перепишу его, чтобы взять разные конфигурации группировок. Я многому научился с тех пор, как написал эту функцию!
Ари Б. Фридман
1
Мне нравятся твои сюжеты намного лучше, чем туфты, которые до смешного трудно читать. Я все еще думаю, что боксплоты в стиле Тьюки лучше, хотя хорошим компромиссом может быть что-то вроде того, что у вас есть, но с шириной в 3 пикселя для бокса вместо смещения в 1 пиксель. И я думаю, что горизонтальная линия шириной 1px для медианы, вероятно, аккуратнее и точнее.
naught101
19

Мы не должны забывать о симпатичном и (исторически) важном сюжетном стебле и листьях (который Туфте тоже любит!). Вы получите непосредственный числовой обзор плотности и формы данных (конечно, если ваш набор данных не превышает 200 баллов). В R функция stemсоздает отображение стебля и листьев (в рабочей области). Я предпочитаю использовать gstemфункцию из пакета fmsb, чтобы нарисовать ее прямо в графическом устройстве. Ниже приведено отклонение температуры тела бобра (данные должны быть в вашем наборе данных по умолчанию) в отображении стволовых листьев:

  require(fmsb)
  gstem(beaver1$temp)

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

Geek On Acid
источник
15

В дополнение к отличной работе Tufte, я рекомендую книги Уильяма С. Кливленда: Визуализация данных и Элементы графического представления данных . Мало того, что они превосходны, но все они были сделаны в R, и я считаю, что код общедоступен.

Питер Флом
источник
14

! Присущ рефлективные, вербальные Пример из справки R:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")

На мой взгляд, это самый удобный способ быстро взглянуть на данные или сравнить распределение. Для более сложных дистрибутивов есть расширение, называемое vioplot.

МБк
источник
2
Здесь также можно упомянуть Beanplot: jstatsoft.org/v28/c01/paper и cran.r-project.org/web/packages/beanplot/index.html
radek
Боксплоты не так недооценены, не так ли? Я имею в виду, конечно, во многих бумагах столбчатые диаграммы используются для данных, которые должны быть построены на коробках, но они все еще довольно распространены.
naught101
11

Кажется, что мозаичные участки соответствуют всем четырем упомянутым критериям. Есть примеры в г, под мозаику.

Питер Флом
источник
3
Лучшая реализация мозаичных графиков - в библиотеке vcd (имя функции «мозаика»). Он имеет гораздо более гибкую сигнатуру метода и реализован в виде сетки (а не «базовой» графической системы).
Даг
10

Проверьте работу Эдварда Туфте и особенно эту книгу

Вы также можете попробовать поймать его путевую презентацию . Это довольно хорошо и включает в себя связку из четырех его книг. (Клянусь, у меня нет акций его издателя!)

Кстати, мне нравится его техника визуализации спарклайновых данных. Сюрприз! Google уже написал это и разместил в Google Code

Пол Сасик
источник