jjzjj

ggplot2优雅的自定义轴文本颜色

R语言数据分析指南 2023-06-10 原文

今天来主要介绍如何在不引入外部几何对象的前提下在图形的原有的基础上自定义修改轴文本颜色,也许恰好您正好有此特殊需求,希望对各位观众老爷有所帮助;下面来看具体案例;

加载R包

library(tidyverse)

数据清洗

data1 <- mtcars %>% head(6) %>% 
  mutate_if(is.numeric, function(x) x+10) %>% 
  log10() %>% as.data.frame() %>% 
  rownames_to_column("type") %>%
  pivot_longer(-type) %>%
  mutate(type=factor(type)) %>% arrange(type)

定义标记角度

empty_bar <- 0
data1$id <- seq(1,nrow(data1))
label_data <- data1
number_of_bar <- nrow(label_data)
angle <-  90 - 360 * (label_data$id-0.5) /number_of_bar    
label_data$hjust<-ifelse( angle < -90, 1, 0)
label_data$angle<-ifelse(angle < -90, angle+180, angle)

定义颜色

colors <-c("#FED439FF","#709AE1FF",
           "#D5E4A2FF","#197EC0FF","#F05C3BFF","#46732EFF",
           "#71D0F5FF","#370335FF","#075149FF","#C80813FF","#91331FFF",
           "#1A9993FF","#FD8CC1FF")

数据可视化

ggplot(data1,aes(id,value+5,fill=type))+
  geom_bar(stat="identity",alpha=0.8)+
  scale_fill_manual(values = colors)+
  labs(x=NULL,y=NULL)+
  ylim(-7,14)+
  coord_polar(start =0)+
  theme_void()+
  theme(
    legend.text = element_text(color="black"),
    legend.title=element_blank(),
    legend.spacing.x=unit(0.2,'cm'),
    legend.key=element_blank(),
    legend.key.width=unit(0.3,'cm'),
    legend.key.height=unit(0.3,'cm'),
    legend.position=c(0.5,0.5))+
  # 添加标签
  geom_text(data=label_data,aes(x=id, y=value+5.5,label=type,hjust=hjust,color=name),
            fontface="plain",size=2.5,show.legend = F,
            angle= label_data$angle,inherit.aes = FALSE)+
  scale_color_manual(values = colors)+
  # 添加外圈
  geom_segment(aes(x=0, y=14,xend=66.5,yend =14),size=1.5,color="#3B9AB2",
               arrow = arrow(length = unit(0, "npc"),type="closed"))+
  # 添加内圈
  geom_segment(aes(x=0, y=-2,xend=66.5,yend =-2),size=0.5,color="#3B9AB2",
               arrow = arrow(length = unit(0, "npc"),type="closed"))+
  geom_segment(aes(x=0, y=-0.1,xend=66.5,yend =-0.1),size=0.5,color="grey",
               arrow = arrow(length = unit(0, "npc"),type="closed"))

可以看到此处我们使用的geom_text在图形内部添加文本并定义颜色,那如果我们要在图形外部修改轴文本颜色该如何操作,当然有更加简单的方法请往下看

构建数据

df <- data1 %>% arrange(id) %>%
  mutate(id=as.character(id)) %>% head(30)

df$id <- factor(df$id,levels = df$id)

基础绘图

p <- df %>% ggplot(.,aes(id,value+5,fill=type))+
  geom_bar(stat="identity",alpha=0.8)+
  scale_fill_manual(values =c("#EDB749","#3CB2EC","#9C8D58"))+
  scale_y_continuous(expand = expansion(0))+
  coord_flip()+
  theme_test()+
  labs(x=NULL,y=NULL)+
  theme(
    axis.text.y=element_text(size=12),
    legend.text = element_text(color="black"),
    legend.title=element_blank(),
    legend.spacing.x=unit(0.2,'cm'),
    legend.key=element_blank(),
    legend.key.width=unit(0.3,'cm'),
    legend.key.height=unit(0.3,'cm'),
    legend.position="top")

一个基础的条形图而已,下面我们就在此基础上修改Y轴文本颜色

统一个数

x_cols <- rep(c("#EDB749","#3CB2EC","#9C8D58","#4A452A"),each=11)

p + theme(axis.text.y = element_text(colour=x_cols))

可以看到每一组只对应一种颜色,如果我们想自定义任意文本颜色那,继续往下看


自定义个数

x_cols <- rep(c("#EDB749","#4A452A","#3CB2EC","#9C8D58"),time=c(6,5,11,8))

p + theme(axis.text.y = element_text(colour=x_cols))

可以看到引入time参数控制每一个颜色出现的次数

当然上述操作ggplot2会显示如下警告信息,是不是发现了什么;感觉挺有趣的

Warning message:
Vectorized input to element_text() is not officially supported.
Results may be unexpected or may change in future versions of ggplot2.

本节介绍到此结束,更多精彩内容请关注我的公众号R语言数据分析指南

有关ggplot2优雅的自定义轴文本颜色的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  4. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  5. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  6. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  9. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  10. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

随机推荐