2015-12-03 6 views
1

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

У меня есть числовые данные в 4 категориях (столбцы 2-5) и хотелось бы пометить каждый datapoint инициалами (столбец 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 отключена.

enter image description here

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

ответ

0

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

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)) 

enter image description here

+0

Привет Сэм, красивые вещи. Я вижу много, чтобы узнать, что у меня есть. Большое спасибо. – SeanJ

3

Как использовать метки как маркеры точек, а не отдельные метки? Вот пример, используя 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) 

enter image description here

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

# 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) 

enter image description here

+0

Привет eipi10, потрясающие сюжеты. Большое спасибо. Они работают как шарм, хотя я должен признать, что не нашел бы этого решения за миллион лет. Поскольку я работал с R всего несколько дней, мне потребовалось некоторое время, чтобы воспроизвести. Я пересказываю свои неудачи здесь, чтобы другие избегали: не удалось загрузить пакеты> пришлось устанавливать; установка не работала для всех пакетов> пришлось обновлять RStudio; все еще не для всех> должен был обновить R; и вуаля, наконец, я понял. – SeanJ

+0

Это прекрасно для меня. Я не сильный в R, хотя - как бы вы изменили это, чтобы обрабатывать любое количество категорий (столбцы; 4 в OP)? Когда я добавляю больше, я получаю «Ошибка в f (..., self = self): Разрывы и метки различной длины». Начиная с 4 до 10 категорий, я догадался при изменении n()/25 до n()/10, но с той же ошибкой. Я зашел так далеко, насколько я могу смотреть на код. –

+0

Чтобы ответить на мой собственный комментарий, установите breaks = (scale_y_continuous (labels = sort (unique (dm $ variable)), breaks = seq (length (unique (dm $ variable)))) +) исправляет проблему, и теперь кажется, что обрабатывать любое количество строк/столбцов. –