【问题标题】:Coloring and Labeling points in geom_pointgeom_point 中的着色和标记点
【发布时间】:2018-09-06 09:29:09
【问题描述】:

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

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

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

  1. 着色点

如果它是一个级别,我会使用 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. 标记和着色所述标签

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

可重现的数据:

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

【问题讨论】:

    标签: r ggplot2 colors geom-text


    【解决方案1】:

    一般来说,我个人更喜欢将所有数据放在一个数据框中,并向其中添加另一个变量:因此,将 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
    

    【讨论】:

    • 我会考虑把它变成一个单一的数据框。但是,你能解释一下为什么你必须重复颜色一些 2 次和一些 1。我想如果除了灰色之外它们都重复两次,我会理解更多。该过程是否用于第二级?
    • 所以它就像在继续之前设置颜色一样简单。
    • ggplot 按字母顺序将 cdf 中的颜色分配给 df$namerep(...,1) 用于Charlie 的单次出现,rep(...,2) 用于AliceAlice2
    • 我没有按字母顺序排列数据,而是按字母顺序排列了数据。 charlie 也应该有第二个级别。我很抱歉。我可能应该更好地说明这一点。这是否仅仅意味着改变颜色的顺序以反映数据框的顺序?
    • ggplot(在此版本中)似乎对一个 aes(此处:color) alphabetically. So, yes, with the actual approach, if you add new names, you have to change your cdf` 变量)的所有变量(此处:namesnames2)的所有级别进行排序以反映这一点。如果我的回答回答了您的问题,请将其标记为已接受。否则,您也可以编辑您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2013-03-15
    • 2020-10-28
    相关资源
    最近更新 更多