一图胜千言,说明了其作为一种展现形式在呈现数据结果时的重要性。虽说图的本质是用来展示结果,其最主要的功能是以简单的形式说明数据中蕴含的意义,但有时候好看的外表也是一种加分项,例如图型的布局,颜色搭配等。好的颜色搭配不仅看起来赏心悦目,更重要的作用应该是能增加数据中的辨识度,给人一目了然的感觉,而不是晕倒在五彩斑斓的迷离中。虽然俺也不善于颜色搭配,但这并不妨碍咱站在巨人的肩膀上来为图增添一抹色彩。下面咱们就来谈谈R语言里,那些好用的配色方案。
RColorBrewer包做为老牌调色板,其提供了3类调色板:1、连续性(sequential)
,生成一系列连续渐变的颜色(共18组颜色,每组9个渐变色);2、 离散型(diverging),生成两端深色、中部浅色的系列颜色(共9组颜色,每组11个颜色),可用来标记数据中的离群点,适用于突显极端数值;3、定性型(qualitative),生成一些列彼此差异比较明显的颜色,通常用来标记分类数据。
display.brewer.all可用来展示预设调色板,默认展示所有调色板,也可指定名称展示某个调色板。brewer.pal.info也可用来查看调色板的信息。display.brewer.all(type='seq')
display.brewer.all(type='div')
display.brewer.all(type='qual')
display.brewer.all(6, select='Set1')
display.brewer.all()
结果如下:

brewer.pal函数用来使用调色板的颜色,需要两个参数:第一个指定颜色数量,最大为选取的调色板的颜色个数;第二个是调色板名称:mycolor <- brewer.pal(8,'Set1')
mycolor
[1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF"
image(1:8,1,as.matrix(1:8),col=mycolor,xlab='',ylab='',axes=F)
结果如下:

colorRampPalette函数可以根据给定的颜色返回一个颜色生成函数,可以调用这个颜色函数生成一系列颜色,数量可以自定义。该方法很适合生成渐变色:mycolor <- colorRampPalette(c('red','blue'))(10)
mycolor
[1] "#FF0000" "#E2001C" "#C60038" "#AA0055" "#8D0071" "#71008D" "#5500AA"
[8] "#3800C6" "#1C00E2" "#0000FF"
image(1:10,1,as.matrix(1:10),col=mycolor,xlab='',ylab='',axes=F)
结果如下:

colorRamp函数也可根据给定颜色返回一个颜色函数,然后调用颜色来生成一系列颜色,该方法会返回一个矩阵,内含RGB格式的颜色编码,一行一个颜色,可以借助rgb函数来解读:
colmat <- colorRamp(c("blue", "green"))((0:4)/4)
colmat
[,1] [,2] [,3]
[1,] 0 0.00 255.00
[2,] 0 63.75 191.25
[3,] 0 127.50 127.50
[4,] 0 191.25 63.75
[5,] 0 255.00 0.00
mycolor <- rgb(colmat,max=255)
mycolor
[1] "#0000FF" "#003FBF" "#007F7F" "#00BF3F" "#00FF00"
image(1:5,1,as.matrix(1:5),col=mycolor,xlab='',ylab='',axes=F)
结果如下:

使用该方法需要注意一点,调用颜色函数时,输入的是[0-1]的数字向量,如这里的(0:4)/4为向量c(0.00, 0.25, 0.50, 0.75, 1.00),一个数字会生成一个颜色。
colorRamp2函数来自于R包circlize,从名字可以看出该函数与上面的colorRamp关系。该函数根据指定端点向量和颜色向量返回一个颜色函数,然后调用颜色函数时输入一个数字向量,就会根据值的大小映射不同的颜色。可见,该函数很适用于热图:
library(circlize)
col_fun <- colorRamp2(c(-1, 0, 1), c("green", "white", "red"))
mycolor <- col_fun(c(-2, -1, -0.5, 0, 0.5, 1, 2))
mycolor
[1] "#00FF00FF" "#00FF00FF" "#B1FF9AFF" "#FFFFFFFF" "#FF9E81FF" "#FF0000FF" "#FF0000FF"
image(1:5,1,as.matrix(1:5),col=mycolor,xlab='',ylab='',axes=F)
结果如下:

该函数来自于单细胞可视化scCustomize包,里面内置了两大类颜色调色板:
p1 <- FeaturePlot_scCustom(seurat_object = pbmc, features = "CD3E")
p2 <- FeaturePlot_scCustom(seurat_object = pbmc, colors_use = viridis_magma_dark_high, features = "CD3E")
p3 <- FeaturePlot_scCustom(seurat_object = pbmc, colors_use = viridis_inferno_dark_high, features = "CD3E")
p4 <- FeaturePlot_scCustom(seurat_object = pbmc, colors_use = viridis_light_high, features = "CD3E")
结果如下:

PalettePlot(palette = DiscretePalette_scCustomize(num_colors = 26, palette = "alphabet"))
PalettePlot(palette = c("color1", "color2", ...)
结果如下:

颜色搭配对于可视化来说还是有一定影响的,虽然说大家的审美观可能不一致,没有必要追求让所有人都认可的美,但在不过分耗费时间的基础上做出符合大众审美的图岂不是美哉!毕竟,图是用来展示给别人看的,美不美观可能影响到的不仅仅是图像本身了!既然,现在有了这么多现成的配色方案,咱们也可以顺手为自己的图润色来提升一下颜值了。
saddleplot | A/B compartments
双曲线火山图一键拿捏
ChIP-seq数据质控
ChatGPT!见证AI的力量!
ChIPseeker绘图函数借用
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景 最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。 在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记
【动态规划】一、背包问题1.背包问题总结1)动规四部曲:2)递推公式总结:3)遍历顺序总结:2.01背包1)二维dp数组代码实现2)一维dp数组代码实现3.完全背包代码实现4.多重背包代码实现一、背包问题1.背包问题总结暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(DynamicPlanning)里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。1)动规四部曲:(1)确定dp数组及其下标的含义(2)确定递推公式(3)dp数组的初始化(4)确定遍历顺
类似:Whatgraphingpackages/APIsexistforPerl?我正在对不同语言的在线图形包进行一些研究,想知道当前有哪些适用于Ruby的最新图形包值得研究。所需的最低功能应包括Google通过itsAPI提供的功能.如能简要介绍所推荐的包/API的主要优势,我们将不胜感激。 最佳答案 我已将以下内容添加为书签,以便在时间允许时进行调查:基于Flash我还没有尝试过这些,但如果你想要活泼的动画,它们看起来都很有前途:amChartsFusionChartsOpenFlashChartZiyagemGoogleCha
1,Camera基本工作原理答案:光线通过镜头Lens进入摄像头内部,然后经过IRFilter过滤红外光,最后到达sensor(传感器),senor分为按照材质可以分为CMOS和CCD两种,可以将光学信号转换为电信号,再通过内部的ADC电路转换为数字信号,然后传输给DSP(如果有的话,如果没有则以DVP的方式传送数据到基带芯片baseband,此时的数据格式RawData,后面有讲进行加工)加工处理,转换成RGB、YUV等格式输出。数据流是如何从sensor到APP的?上述描述结束后,在ISP处理后面的阶段,数据会进行分流,分为capture,preview,video等以供后续动作使用。例如
资源下载地址:https://download.csdn.net/download/sheziqiong/86763967资源下载地址:https://download.csdn.net/download/sheziqiong/86763967基于C++实现一个支持简单交互绘图小程序一、概要设计1.1开发环境IDE:VisualStudio2019Commity运行环境:window10专业版配置要求:内存4g显卡无要求CPU无要求目的调试编译通过图形应用编码、熟悉flk1.2结构化模块设计图UML类图1.3主要模块功能接口描述Graph.cppvoidShape::add(Pointp)//
📢博客主页:https://blog.csdn.net/dxt19980308📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由肩匣与橘编写,首发于CSDN🙉📢生活依旧是美好而又温柔的,你也是✨目录🔴线性表1.1顺序表1.1.1顺序表定义1.1.2顺序表基本操作1.2单链表1.2.1单链表节点定义1.2.2单链表基本操作1.3双链表1.3.1双链表节点定义1.3.2双链表基本操作1.4静态链表🟠栈和队列2.1栈2.1.1顺序栈2.1.2链式栈2.2队列2.2.1顺序队列2.2.2链式队列2.3应用🟡串3.1串的定义与实现3.2串的模式匹配🟢树与二叉树4.1二叉树4.1.1二叉树的概念4.1.2
目录MyBatisPlusMP特点MP框架结构MP使用准备导入依赖springboot整合mybatisplus配置文件定义好实体类User后编辑mapper接口@Mapper与@MapperScan("包名")区别MP基本操作新增操作删除操作通过id删除用户通过map作为条件删除通过多个id实现删除更新用户通过id进行用户更新查询用户 根据id查询用户根据多个id查询用户根据map集合作为条件查询用户通用Service接口一些操作 查询总记录数批量添加数据MP常用注解雪花算法前言垂直分表水平分表条件构造器继承结构使用条件构造器实现查询操作查询所有用户根据构造器查询主键字段集合根据条件构造器查
本文总结了在以太坊智能合约中使用Solidity在合约内创建合约以及引用其他合约的方法,包括了如何使用mochai进行测试的方法。在这之前先明白一个比较:Contract{}相当于面向对象语言的类当部署后获得到address后,address相当于对象,address0x.......本身就类似指针地址然后我们讨论下Solidity代码中对合约类,合约对象的操作。Solidity首先区分下三种写法:import'ContractB.sol';ConractBB=newConractB(arg1,arg2...);ContractBB=ContractB(Baddress);functionse