2016-05-26 4 views
0

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

require(ggplot2) 

title <- c("COGNITION","MUTAT RES-DNA REPAIR","AM J PHYSIOL-CELL PH","AM J PHYSIOL-CELL PH","BLOOD", 
     "PNAS","BIOCHEM BIOPH RES CO","CLIN CANCER RES","BIOCHEM BIOPH RES CO","MOL THER") 
value <- c(-0.428, -0.637, -0.740, -0.782, -0.880, -1.974, -1.988, -2.029, -2.217, -2.242) 
indicator <- c(rep("highlight",5), rep("normal",5)) 

df <- data.frame(title, value, indicator) 

mycolors <- c("highlight" = "blue", "normal" = "red") 

x_axis_range <- c((min(df$value)), (max(df$value))) 

p <- ggplot(df, aes(x = title, y = value)) + 
    geom_point(aes(size=3, color=indicator)) + 
    coord_flip() + 
    scale_color_manual(values=mycolors) + 
    scale_y_continuous(limit=x_axis_range) + 

    # produces uneven spacing 
    scale_x_discrete(limits=df$title) + 

    theme(legend.position="none") 

show(p) 

Uneven y-axis

Я не знаю, почему ggplot добавляет дополнительное пространство между MOL THER и CLIN CANCER RES и между BLOOD и AM J PHYSIOL-CELL PH точек данных. Когда я изменить scale_x_discrete() строку:

scale_x_discrete(limits=df$title.1) + 

Это расстояние становится еще, но порядок данных изменяется на в алфавитном порядке по названию снизу-вверх.

Even axis but alphabetical

Почему добавление .1 к концу limits=df$title даже из расстояния? Как я могу сохранить эту четность и по-прежнему управлять порядком данных по оси Y с помощью функции order()?

ответ

1

Вы получаете неравномерное расстояние для дискретного масштаба, потому что, предоставляя df$title, вы даете 10 значений, но на графике имеется только 8 уникальных значений - поэтому для уже используемых уровней есть два пробела.

Когда вы предоставляете scale_x_discrete(limits=df$title.1) пределов фактически игнорируются, поскольку нет title.1 столбца данных и результат NULL

Чтобы получить заказ вам нужно предоставить unique() значение df$title, которые преобразуются в символ (сохранить первоначальный порядок)

ggplot(df, aes(x = title, y = value)) + 
    geom_point(aes(size=3, color=indicator)) + 
    coord_flip() + 
    scale_color_manual(values=mycolors) + 
    scale_y_continuous(limit=x_axis_range) + 
    scale_x_discrete(limits=unique(as.character(df$title)))+ 
    theme(legend.position="none") 
+0

Отлично! Отличный ответ. – tn3rt

Смежные вопросы