使用Matlab函数选择常见颜色的RGB值用于绘图等
Matlab自带的颜色种类太少了,只有 r/g/b/c/m/y/k
等,而且过于饱和的颜色用来画图并不好看。
现在也有Matlab的颜色插件,大部分的思路是选择一个颜色套系(colormap),然后在其中选择几个不同的颜色。这样画图的线条颜色风格确实比较一致,但是颜色的选择不够自由,而且可能需要一个个试才知道某个颜色实际是什么颜色。
而且这些插件还不够简单,或者需要安装或购买。最简单的颜色生成方法就是:输入一个颜色名称,然后函数输出对应的RGB值,同时提供颜色调色盘方便选择哪个颜色,其实只是一个cell操作就能解决的事情。
声明:所有脚本来源于豆包AI生成后修改,自己用着没问题,不能完全保证正确性。
RGB名字和RGB颜色库生成文件(.m脚本)
- 考虑到比较常见且数量足够的颜色库是html标准颜色库,这里让AI总结html颜色表,总计94个,应该是够多了。
- 如果你想继续加入颜色,务必保证所有RGB值和颜色名字在各自cell中的顺序是一一对应的。
- 每个颜色的名字都是html标准颜色,名字格式为大驼峰法(例如
AaaBbbCcc
)。 - RGB值已经归一化,取值为0~1的小数。如果要转换成常见的RGB色彩值,乘256即可。所有色彩在RGB256基准下都是整数。
- 所有的色彩将会被绘制成色环,并标注颜色名,这样可以方便地选取颜色。
- 该脚本会保存以下数据:第一,色彩库
clrmap.mat
(94×2 cell变量名为clrmap,第一列为名称(string),第二行为RGB值(1×3 double matrix));第二,色环图,分别保存为fig和jpg格式,名称为fcolor。
以下是脚本 colorgen.m
:
%% 自己添加任意颜色clrrgb = {% 品红系(Magenta)[255, 0, 255]./256; % Magenta[255, 105, 180]./256; % HotPink[255, 20, 147]./256; % DeepPink[199, 21, 133]./256; % MediumVioletRed[219, 112, 147]./256; % PaleVioletRed[238, 130, 238]./256; % Violet[255, 192, 203]./256; % Pink[255, 182, 193]./256; % LightPink% 红色系(Red)[255, 0, 0]./256; % Red[220, 20, 60]./256; % Crimson[178, 34, 34]./256; % FireBrick[139, 0, 0]./256; % DarkRed[128, 0, 0]./256; % Maroon[255, 99, 71]./256; % Tomato[255, 127, 80]./256; % Coral[255, 160, 122]./256; % LightSalmon[255, 128, 128]./256; % LightCoral% 橙色系(Orange)[255, 165, 0]./256; % Orange[255, 140, 0]./256; % DarkOrange[255, 69, 0]./256; % OrangeRed[255, 215, 0]./256; % Gold[184, 134, 11]./256; % GoldenRod[255, 128, 0]./256; % Orange[210, 105, 30]./256; % Chocolate[160, 82, 45]./256; % Sienna[139, 69, 19]./256; % SaddleBrown[165, 42, 42]./256; % Brown[139, 35, 35]./256; % FireBrick% 黄色系(Yellow)[255, 255, 0]./256; % Yellow[173, 255, 47]./256; % GreenYellow[154, 205, 50]./256; % YellowGreen[240, 230, 140]./256; % Khaki[255, 250, 205]./256; % LemonChiffon[255, 255, 224]./256; % LightYellow[250, 250, 210]./256; % LightGoldenRodYellow[245, 245, 220]./256; % Beige[255, 248, 225]./256; % Cornsilk[255, 240, 245]./256; % LavenderBlush[255, 228, 181]./256; % Moccasin[255, 222, 173]./256; % NavajoWhite[255, 218, 185]./256; % PeachPuff[255, 228, 196]./256; % Bisque[255, 208, 184]./256; % Moccasin[255, 192, 128]./256; % LightSalmon% 绿色系(Green)[0, 255, 0]./256; % Lime[50, 205, 50]./256; % LimeGreen[0, 128, 0]./256; % Green[34, 139, 34]./256; % ForestGreen[46, 139, 87]./256; % SeaGreen[85, 107, 47]./256; % DarkOliveGreen[144, 238, 144]./256; % LightGreen[152, 251, 152]./256; % PaleGreen[128, 255, 128]./256; % LightGreen[0, 255, 128]./256; % SpringGreen[60, 179, 113]./256; % MediumSpringGreen[128, 128, 0]./256; % Olive% 青色系(Cyan)[0, 255, 255]./256; % Cyan[0, 139, 139]./256; % DarkCyan[32, 178, 170]./256; % LightSeaGreen[175, 238, 238]./256; % PaleTurquoise[0, 128, 128]./256; % Teal[128, 255, 255]./256; % LightCyan[240, 255, 255]./256; % Azure[240, 255, 240]./256; % HoneyDew% 蓝色系(Blue)[0, 0, 255]./256; % Blue[0, 0, 205]./256; % MediumBlue[0, 0, 139]./256; % DarkBlue[25, 25, 112]./256; % MidnightBlue[0, 69, 255]./256; % DodgerBlue[0, 191, 255]./256; % DeepSkyBlue[135, 206, 235]./256; % SkyBlue[135, 206, 250]./256; % LightSkyBlue[173, 216, 230]./256; % LightBlue[70, 130, 180]./256; % SteelBlue[100, 149, 237]./256; % CornflowerBlue[64, 164, 223]./256; % RoyalBlue[240, 248, 255]./256; % AliceBlue[248, 248, 255]./256; % GhostWhite[255, 248, 240]./256; % FloralWhite[255, 228, 225]./256; % MistyRose% 紫色系(Purple)[128, 0, 128]./256; % Purple[138, 43, 226]./256; % BlueViolet[123, 104, 238]./256; % MediumSlateBlue[147, 112, 219]./256; % MediumPurple[186, 85, 211]./256; % MediumOrchid[128, 0, 255]./256; % Indigo[128, 128, 255]./256; % SlateBlue[255, 128, 255]./256; % Pink% 黑白灰色系(亮→暗)[255, 255, 255]./256; % White[255, 250, 240]./256; % Snow[255, 255, 240]./256; % Ivory[192, 192, 192]./256; % Silver[128, 128, 128]./256; % Gray[0, 0, 0]./256 % Black
};clrname = {% 品红系(Magenta)"Magenta";"HotPink";"DeepPink";"MediumVioletRed";"PaleVioletRed";"Violet";"Pink";"LightPink";% 红色系(Red)"Red";"Crimson";"FireBrick";"DarkRed";"Maroon";"Tomato";"Coral";"LightSalmon";"LightCoral";% 橙色系(Orange)"Orange";"DarkOrange";"OrangeRed";"Gold";"GoldenRod";"Orange";"Chocolate";"Sienna";"SaddleBrown";"Brown";"FireBrick";% 黄色系(Yellow)"Yellow";"GreenYellow";"YellowGreen";"Khaki";"LemonChiffon";"LightYellow";"LightGoldenRodYellow";"Beige";"Cornsilk";"LavenderBlush";"Moccasin";"NavajoWhite";"PeachPuff";"Bisque";"Moccasin";"LightSalmon";% 绿色系(Green)"Lime";"LimeGreen";"Green";"ForestGreen";"SeaGreen";"DarkOliveGreen";"LightGreen";"PaleGreen";"LightGreen";"SpringGreen";"MediumSpringGreen";"Olive";% 青色系(Cyan)"Cyan";"DarkCyan";"LightSeaGreen";"PaleTurquoise";"Teal";"LightCyan";"Azure";"HoneyDew";% 蓝色系(Blue)"Blue";"MediumBlue";"DarkBlue";"MidnightBlue";"DodgerBlue";"DeepSkyBlue";"SkyBlue";"LightSkyBlue";"LightBlue";"SteelBlue";"CornflowerBlue";"RoyalBlue";"AliceBlue";"GhostWhite";"FloralWhite";"MistyRose";% 紫色系(Purple)"Purple";"BlueViolet";"MediumSlateBlue";"MediumPurple";"MediumOrchid";"Indigo";"SlateBlue";"Pink";% 黑白灰色系(亮→暗)"White";"Snow";"Ivory";"Silver";"Gray";"Black"
};
%%% 3. 色环核心参数设置(沿用你的原始参数)
N = length(clrrgb); % 颜色总数
R_inner = 0.6; % 内圆半径(色块内边界)
R_outer = 1.0; % 外圆半径(色块外边界)
theta = linspace(0, 2*pi, N+1); % 每个色块的角度范围(含首尾重合点)% 4. 创建图形窗口并设置属性(沿用你的原始设置,新增回调函数容器)
figure('Position', [0, 0, 1000, 1000], ...'Name', 'HTML颜色色环图(带点击显示RGB)'); % 窗口名称
hold on; axis equal; axis off; % 等比例坐标轴,隐藏坐标轴
colormap(parula); % 临时 colormap,不影响色块颜色% 用于存储点击提示文本的句柄(后续点击时更新,避免重复显示)
h_text_info = text(0, -1.3, '', ...'HorizontalAlignment', 'center', ...'FontSize', 10, ...'FontWeight', 'bold', ...'Color', 'red');% 5. 循环绘制每个颜色的扇形色块(新增点击回调功能)
for i = 1:N% —— 步骤1:绘制扇形色块(新增Tag和ButtonDownFcn回调) ——theta1 = theta(i);theta2 = theta(i+1);[x, y] = pol2cart([theta1, theta2, theta2, theta1], [R_inner, R_inner, R_outer, R_outer]);% 绘制色块并添加点击回调:点击时触发显示当前色块的RGB值h_patch = patch(x, y, clrrgb{i}, ...'EdgeColor', 'white', ...'LineWidth', 0.5, ...'Tag', ['color_', num2str(i)]);% —— 步骤2:计算标注位置与角度(完全保留你的原始逻辑) ——theta_mid = (theta1 + theta2) / 2; % 色块中间角度(弧度)theta_deg = rad2deg(theta_mid); % 转为角度(0~360°)R_text = R_outer + 0.05; % 文本半径(略大于色块)[x_text, y_text] = pol2cart(theta_mid, R_text); % 文本坐标% —— 关键优化:你的角度控制逻辑(完全保留) ——if theta_deg >= 90 && theta_deg < 180text_rotation = theta_deg + 180;h_align = 'right';elseif theta_deg >= 180 && theta_deg < 270text_rotation = theta_deg - 180;h_align = 'right';elsetext_rotation = theta_deg;h_align = 'left';end% —— 步骤3:绘制颜色名称标注(完全保留你的原始设置) ——text(x_text, y_text, clrname{i}, ...'HorizontalAlignment', h_align, ...'VerticalAlignment', 'middle', ...'Rotation', text_rotation, ...'FontSize', 9, ...'FontWeight', 'bold');
endhold off;saveas(gcf,'fcolor.jpg');
savefig(1,'fcolor.fig');clrmap = [clrname clrrgb];
save('clrmap.mat',"clrmap");
以下是生成的色环图,这部分代码比较复杂,如果你想优化就自己进行了。
RGB颜色库查找函数(.m函数,名为 fcolor
)
执行路径下必须有 fcolor.m
函数文件和上述保存的 clrmap.mat
。
以下是函数fcolor.m
文件内容。
% 输入一个颜色名称(标准html颜色),返回对应的0~1 rgb值function [rgb] = fcolor(name)load("clrmap.mat","clrmap");rows = size(clrmap,1);row_find = 0;for k = 1:rowsif(strcmp(clrmap{k,1},name))row_find = k;break;elsecontinue;endendif(row_find==0)warning('Color name does not exist! Black for default.');rgb = [0,0,0]; elsergb = clrmap{row_find,2};end
end
调用fcolor
函数,即可返回对应的颜色RGB值。
举一个plot
中使用的例子:
plot(0:0.1:1,0:0.1:1,'-^',...'Color',fcolor("Crimson"),...'MarkerFaceColor',fcolor('Olive'),...'MarkerEdgeColor',fcolor('Indigo')...);
画出来的图长这样: