Matlab产生常见颜色
使用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 < 180
text_rotation = theta_deg + 180;
h_align = 'right';
elseif theta_deg >= 180 && theta_deg < 270
text_rotation = theta_deg - 180;
h_align = 'right';
else
text_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');
end
hold 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
文件内容,注意,如果输入一个不存在的颜色名字,则会默认输出黑色([0 0 0])并给出Warning。
% 输入一个颜色名称(标准html颜色),返回对应的0~1 rgb值
function [rgb] = fcolor(name)
load("clrmap.mat","clrmap");
rows = size(clrmap,1);
row_find = 0;
for k = 1:rows
if(strcmp(clrmap{k,1},name))
row_find = k;
break;
else
continue;
end
end
if(row_find==0)
warning('Color name does not exist! Black for default.');
rgb = [0,0,0];
else
rgb = 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')...
);
画出来的图长这样: