Можно ли помечать точки данных на ленточных диаграммах?

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

У меня есть числовые данные в 4 категориях (столбцы 2-5), и я хотел бы пометить каждую точку данных инициалами (столбец 1).

Это мои данные и код, который я пробовал:

initials,total,interest,slides,presentation
CU,1.6,1.7,1.5,1.6
DS,1.6,1.7,1.5,1.7
VA,1.7,1.5,1.5,2.1
MB,2.3,2.0,2.1,2.9
HS,1.2,1.3,1.4,1.0
LS,1.8,1.8,1.5,2.0

stripchart(CTscores[-1], method = "stack", las = 1)
text(CTscores$total + 0.05, 1, labels = CTscores$name, cex = 0.5)

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

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

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


person SeanJ    schedule 03.12.2015    source источник


Ответы (2)


Вот альтернатива, которая позволяет вам добавить цвет к ленточной диаграмме, чтобы идентифицировать инициалы:

library(ggplot2)
library(reshape2)
library(gtable)
library(gridExtra)

# Gets default ggplot colors
gg_color_hue <- function(n) {
  hues = seq(15, 375, length=n+1)
  hcl(h=hues, l=65, c=100)[1:n]}

# Transform to long format
CTscores.m = melt(CTscores, id.var="initials")

# Create a vector of colors with keys for the initials
colvals <- gg_color_hue(nrow(CTscores))
names(colvals) <- sort(CTscores$initials)

# This color vector needs to be the same length as the melted dataset
cols <- rep(colvals,ncol(CTscores)-1)

# Create a basic plot that will have a legend with the desired attributes
g1 <- ggplot(CTscores.m, aes(x=variable, y=value, fill=initials)) +
  geom_dotplot(color=NA)+theme_bw()+coord_flip()+scale_fill_manual(values=colvals)

# Extract the legend
fill.legend <- gtable_filter(ggplot_gtable(ggplot_build(g1)), "guide-box") 
legGrob <- grobTree(fill.legend)

# Create the plot we want without the legend
g2 <- ggplot(CTscores.m, aes(x=variable, y=value)) +
  geom_dotplot(binaxis="y", stackdir="up",binwidth=0.03,fill=cols,color=NA) +
  theme_bw()+coord_flip()

# Create the plot with the legend
grid.arrange(g2, legGrob, ncol=2, widths=c(10, 1))

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

person Sam Dickson    schedule 03.12.2015
comment
Привет Сэм, красивые вещи. Я вижу, что мне еще предстоит многому научиться. Большое спасибо. - person SeanJ; 05.12.2015

Как насчет использования меток в качестве точечных маркеров, а не отдельных меток? Вот пример использования ggplot2 вместо базовой графики.

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

library(ggplot2)
library(reshape2)
library(dplyr)

# Convert data from "wide" to "long" format
CTscores.m = melt(CTscores, id.var="initials")

# Create an offset that we'll use for vertically separating the repeated values
CTscores.m = CTscores.m %>% group_by(variable, value) %>%
  mutate(repeats = ifelse(n()>1, 1,0),
         offset = ifelse(repeats==0, 0, seq(-n()/25, n()/25, length.out=n())))

ggplot(CTscores.m, aes(label=initials, x=value, y=as.numeric(variable) + offset,
                       color=initials)) +
  geom_text() +
  scale_y_continuous(labels=sort(unique(CTscores.m$variable))) +
  theme_bw(base_size=15) +
  labs(y="", x="") +
  guides(color=FALSE)

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

Для полноты, вот как создать график с дрожанием для повторяющихся значений, а не с определенным смещением:

# Convert data from "wide" to "long" format
CTscores.m = melt(CTscores, id.var="initials")

# Mark repeated values (so we can selectively jitter them later)
CTscores.m = CTscores.m %>% group_by(variable, value) %>%
  mutate(repeats = ifelse(n()>1, 1,0))

# Jitter only the points with repeated values
set.seed(13)
ggplot() +
  geom_text(data=CTscores.m[CTscores.m$repeats==1,], 
            aes(label=initials, x=value, y=variable, color=initials),
            position=position_jitter(height=0.25, width=0)) +
  geom_text(data=CTscores.m[CTscores.m$repeats==0,], 
            aes(label=initials, x=value, y=variable, color=initials)) +
  theme_bw(base_size=15) +
  guides(color=FALSE)

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

person eipi10    schedule 03.12.2015
comment
Привет eipi10, потрясающие сюжеты. Большое спасибо. Они работают как волшебство, хотя, должен признать, я бы не нашел такого решения и за миллион лет. Поскольку я работаю с R всего несколько дней, мне потребовалось довольно много времени, чтобы воспроизвести. Я пересказываю здесь свои неудачи, чтобы другие их не замечали: не удалось загрузить пакеты › пришлось установить; установка не работала для всех пакетов › пришлось обновить RStudio; еще не для всех › пришлось обновить R; и вуаля, наконец-то я понял. - person SeanJ; 05.12.2015
comment
Это идеально подходит и для меня. Однако я не силен в R - как бы вы изменили это, чтобы обрабатывать любое количество категорий (столбцов; 4 в ОП)? Когда я добавляю больше, я получаю ошибку в f(..., self = self) : разрывы и метки имеют разную длину. Переходя от 4 к 10 категориям, я догадался изменить n()/25 на n()/10, но та же ошибка. Я зашел так далеко, как только мог, глядя на код. - person Graham Jones; 14.09.2017
comment
Чтобы ответить на мой собственный комментарий, установка breaks= (scale_y_continuous(labels=sort(unique(d.m$variable)),breaks=seq(length(unique(dm$variable)))) +) устраняет проблему, и теперь она, кажется, справляется любое количество строк/столбцов. - person Graham Jones; 14.09.2017