Окрашивание и маркировка точек в geom_point - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь создать полярную диаграмму с двумя уровнями, похожими на: enter image description here

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

У меня есть два кадра данных, которые в основном одинаковы. У одного из них есть дополнительный столбец df2$plotter, который я использую для создания подмножества данных, чтобы затем построить второй уровень. Цветовой вектор, cdf, - это вектор, в котором у меня есть значения HEX в качестве цветов.

  1. Раскраски

Если бы это был один уровень, я бы использовал точки scale_color_manual и fill/color таким образом. Однако, поскольку у меня есть два кадра данных, я подумал, что могу назвать color vector, так что он будет использоваться для раскраски на основе значений в векторе. Все же это не использует те цвета, которые я назначил. Вместо этого он помечает точки D to O как murky green, а не grey, как указано кодом HEX: #A9A9A9, и использует цвет как часть легенды. Я бы предпочел отображение, как показано ниже. Я не знаю, как создать такой цветовой вектор, чтобы значения для каждой ячейки использовались в качестве фактического цвета, этот вектор также должен работать для раскраски надписей. Во-вторых, когда я пытаюсь передать тот же вектор для второго уровня, aesthetics in geom_point как Error: Aesthetics must be either lenght 1 or the same as the data Это то же самое, что и добавление plotter в цветовую палитру, но, скорее всего, я предполагаю, что делать с размером самого вектора. Я также предпочел бы не создавать другой цветовой вектор, а просто обратиться к первому.

Alice (оба Alice and Alice2) равны #b79f00

Bob is #00ba38

Charlie is #00bfc4

Peter is # 619cff`

Quin is #F8766D

Roger is # f564e3`

• Тогда D to O равно #A9A9A9

  1. Маркировка и окраска указанных этикеток

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

enter image description here

Воспроизводимые данные:

k<-18  
ct<-12 
x_vector<-seq(1,k,1)
radius<-rep(5,k,1)
name<-c('Alice','Bob','Charlie','D','E','F','G','H','I','J','K','L','M','N','O','Peter','Quin','Roger')
df<-data.frame(x_vector,radius,name)

name2<-c('Alice2','Bob2','Charlie2','D','E','F','G','H','I','J','K','L','M','N','O','Peter2','Quin2','Roger2')
plotter<-c(1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1)
radius2<-rep(7,k,1)
df2<-data.frame(x_vector,radius2,name2,plotter)

color1<-c('#F8766D'
          ,'#F564E3'
          ,'#B79F00'
          )
other_color<-c(rep('#A9A9A9',ct))
color2<-c('#00BFC4'
          ,'#619CFF'
          ,'#00BA38'
          )
cdf<-c(color1,other_color,color2)  #color palette
df$label_radius<-df$radius+0.5  ##used to adjust the labels by a radius of 0.5
p<-ggplot()+
  ## Level1
  geom_point(data=df,aes(x=x_vector,y=radius,color=cdf,fill=cdf),size=3,shape=21)+
  geom_text(data=df,aes(x=x_vector,y=label_radius,label=name,color=name))+

  ## Level2
  geom_point(data=df2[(df2$plotter>0),], aes(x=x_vector,y=radius2,color=name2,fill=name2),size=3,shape=21)+
  geom_text(data=df2[(df2$plotter>0),], aes(x=x_vector,y=radius2,label=name2,color=name2))+

  ## transform into polar coordinates
  coord_polar(theta='x',start=0,direction=-1,clip='on')+

  ## sets up the scale to display from 0 to 7
  scale_y_continuous(limits=c(0,7))+

  ## Used to 'push' the points so all 'k' show up.
  expand_limits(x=0)
p

1 Ответ

0 голосов
/ 06 сентября 2018

В общем, я лично предпочел бы, чтобы все данные были в одном кадре данных, и добавить к нему другую переменную: так вместо Bob1 и Bob2 как df$name, имеющего df$name=Bob и создающего, скажем, df$nr. Тогда проще назначить один и тот же цвет для всех Bob случаев.

Но придерживайтесь вашего примера: Вы можете установить значения цветов вручную с помощью scale_color_manual и scale_fill_manual (см. ссылка ).

    library(ggplot2)
    k<-18  
    ct<-12 
    x_vector<-seq(1,k,1)
    radius<-rep(5,k,1)
    name<-c('Alice','Bob','Charlie','D','E','F','G','H','I','J','K','L','M','N','O','Peter','Quin','Roger')
    df<-data.frame(x_vector,radius,name)

    name2<-c('Alice2','Bob2','Charlie','D','E','F','G','H','I','J','K','L','M','N','O','Peter2','Quin2','Roger2')
    plotter<-c(1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1)
    radius2<-rep(7,k,1)
    df2<-data.frame(x_vector,radius2,name2,plotter)

    color1<-c(rep('#F8766D',2), # Alice and Alice2
              rep('#F564E3',2), # Bob and Bob2
              rep('#B79F00',1)  # Charlie
    )
    other_color<-c(rep('#A9A9A9',12))
    color2<-c(rep('#00BFC4',2),
              rep('#619CFF',2),
              rep('#00BA38',2)
    )
    cdf<-c(color1,other_color,color2) #color palette
    df$label_radius<-df$radius+0.5  ##used to adjust the labels by a radius of 0.5
    p<-ggplot()+
      ## Level1
      geom_point(data=df,aes(x=x_vector,y=radius,color=name,fill=name),size=3,shape=21)+
      scale_color_manual(values=cdf)+
      scale_fill_manual(values=cdf)+
      geom_text(data=df,aes(x=x_vector,y=label_radius,label=name,color=name))+

      ## Level2
      geom_point(data=df2[(df2$plotter>0),], aes(x=x_vector,y=radius2,color=name2,fill=name2),size=3,shape=21)+
      geom_text(data=df2[(df2$plotter>0),], aes(x=x_vector,y=radius2,label=name2,color=name2))+

      ## transform into polar coordinates
       coord_polar(theta='x',start=0,direction=-1)+ #,clip='on')+ # <-- the clip property does not work for me, probably due to my ggplot version 

      ## sets up the scale to display from 0 to 7
      scale_y_continuous(limits=c(0,7))+

      ## Used to 'push' the points so all 'k' show up.
      expand_limits(x=0)
    p

enter image description here

...