geom_point 中的着色和标记点

Coloring and Labeling points in geom_point

我正在尝试创建一个具有两个级别的极坐标图,类似于:

但是我在给点上色,然后在不丢失原始点上的颜色的情况下给标签上色时遇到了一些困难。我不知道我应该分多个问题还是一起提问。我把它们放在一起,因为它们与同一张图有关,但如果不允许,请告诉我,我可以在它被否决之前进行编辑。这简直不公平。我在下面发布了一个可重现的示例,并附有评论以使其更容易。

我有两个基本相同的数据框。其中一个有一个额外的列,df2$plotter,我用它来创建数据的一个子集,然后绘制第二级。颜色向量 cdf, 是我将十六进制值作为颜色的向量。

  1. Coloring Points

如果是一个级别,我会使用 scale_color_manualfill/color 这样的点数。但是,由于我有两个数据帧,我想我可以调用一个 color vector 所以说这将用于根据向量中的值进行着色。但是它不使用我分配的那些颜色。相反,它将 D to O 标记为 murky green 而不是 grey,如十六进制代码所示:#A9A9A9 并使用颜色作为图例的一部分。我更喜欢如下映射。我不知道如何创建一个颜色向量,以便将每个单元格的值用作实际颜色,该向量还需要为标签着色。其次,当我尝试为第二级传递相同的向量时,geom_point 中的 aestheticsError: Aesthetics must be either lenght 1 or the same as the data 这两者都将 plotter 添加到调色板中,但最有可能我猜是对向量本身的大小做的。我也不想创建另一个颜色矢量,而只是参考第一个。

Alice(两者都是 Alice and Alice2)是 #b79f00

Bob#00ba38

Charlie#00bfc4

Peter is#619cff`

Quin#F8766D

Roger is#f564e3`

• 那么 D to O 就是 #A9A9A9

  1. Labeling and Coloring said labels

我可以添加标签 geom_text. 然后我调用相同的数据和美学。我的问题部分是上面提到的着色,但现在当我给它们着色时,我失去了我的 color 但保留了我的 fill 点。观察以下。我不知道为什么我的 color 会在途中丢失或如何修复它们。我试图先绘制文本然后绘制点,但这并没有改变任何东西,我也不会猜到它。每个标签的颜色应该与其简而言之的点相同。

Reproducible Data:

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

总的来说,我个人更喜欢将所有数据放在一个数据框中,并向其中添加另一个变量:因此,不用 Bob1Bob2 作为 df$name,具有df$name=Bob 并创建,比如说,df$nr。 这样就可以更轻松地为所有 Bob 次出现分配相同的颜色。

但坚持您的示例:您可以使用 scale_color_manualscale_fill_manual 手动设置颜色值(参见 link)。

    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