使用 Matlab 绘制带有纹理的柱状图

以下是效果

1. 在 Matlab 里安装两个额外的库: hatchfill2 和 legendflex。

(1)搜索并安装 hatchfill2,用来画纹理

(2) 搜索并安装 legendflex,用来画自定义的图例

2. 代码(说明见注释)

data = rand(8, 5);

% 图例文本,因为这个例子是 stacked bar chart, data 数组的每一行是一根柱子,每一列是其中的
% 一段,所以一共有 8 条柱子,每条都被分为了 5 段,每一段是一个 category.
legendData = {'Category 1', 'Category 2', 'Category 3', 'Category 4', 'Category 5'};

% 颜色数组,可以设置为任何喜欢的颜色,hex2rgb 会把 16 进制的颜色数据转化为 rgb 数组
color_vec = [
    hex2rgb("#005C53");
    hex2rgb("#9FC131");
    hex2rgb("#DBF227");
    hex2rgb("#D6D58E");
];

% 预定义的纹理组合,尽量让 texture_types 的数目和 color_vec 互质,这样轮询起来
% 可以得到的组合更多
texture_types = {
    struct('HatchStyle', 'single', 'HatchAngle', 45, 'HatchDensity', 20, 'HatchColor', 'black', 'HatchLineWidth', 0.5);
    struct('HatchStyle', 'single', 'HatchAngle', -45, 'HatchDensity', 20, 'HatchColor', 'black', 'HatchLineWidth', 0.5);
    struct('HatchStyle', 'single', 'HatchAngle', 90, 'HatchDensity', 20, 'HatchColor', 'black', 'HatchLineWidth', 0.5);
    struct('HatchStyle', 'single', 'HatchAngle', 0, 'HatchDensity', 20, 'HatchColor', 'w', 'HatchLineWidth', 0.5);
    struct('HatchStyle', 'cross', 'HatchAngle', 30, 'HatchDensity', 15, 'HatchColor', 'black', 'HatchLineWidth', 0.5);
};

% 创建图形并调整大小
figure('Position', [100, 100, 800, 600]);
hold on;

% 初始化柱状图对象单元数组
bars = cell(size(data, 1), 1);

% 绘制堆叠的柱状图并设置底色和纹理填充
for i = 1:size(data, 1)
    % 如果把'stacked'去掉,就会得到分组的柱状图
    b = bar(i, data(i, :), 'stacked', 'FaceColor', 'flat');
    bars{i} = b; % 存储主 bar 对象
    for j = 1:size(data, 2)
        color_idx = mod(j - 1, size(color_vec, 1)) + 1;
        texture_idx = mod(j - 1, length(texture_types)) + 1;
        b(j).FaceColor = color_vec(color_idx, :);
        % 应用纹理组合
        tex = texture_types{texture_idx};
        hatchfill2(b(j), tex);
    end
end

% 将 bars 转换为矩阵以用于 legendflex
barsMatrix = [bars{:}];

% 调整坐标轴的位置以给图例腾出空间,如果不设置,图例肯能会画到外面,只显示
% 一部分
pos1 = get(gca, 'Position');
set(gca, 'Position', [pos1(1), pos1(2), pos1(3) * 0.75, pos1(4)]);

% 创建自定义图例并设置位置
[legend_h, object_h, plot_h, text_str] = legendflex(barsMatrix, legendData, ...
    'FontSize', 14, 'ref', gca, 'anchor', [4 8], 'buffer', [10 0]);

% 为图例中的柱状图添加纹理填充
numPatches = numel(object_h) - numel(legendData); % 计算图例中需要添加纹理的补丁数量
for k = 1:numPatches
    texture_idx = mod(k - 1, length(texture_types)) + 1;
    tex = texture_types{texture_idx};
    hatchfill2(object_h(numel(legendData) + k), tex);
end

% 设置坐标轴属性
set(gca, 'FontSize', 14);
grid on;
% set(gca, 'XMinorTick', 'on', 'XMinorGrid', 'on', 'YMinorTick', 'on', 'YMinorGrid', 'on');

% 设置 x 轴和 y 轴范围
xlim([0, size(data, 1) + 1]);
ylim([0, max(sum(data, 2)) * 1.1]);

% 设置 x 轴刻度标签
set(gca, 'XTick', 1:size(data, 1), 'XTickLabel', arrayfun(@(x) sprintf('Group %d', x), 1:size(data, 1), 'UniformOutput', false));

% 显示图形
hold off;

% hex2rgb 函数
function rgb = hex2rgb(hex)
    hex = char(hex);
    assert(size(hex, 2) == 7 && hex(1) == '#', 'Input must be a char array of the form "#RRGGBB"');
    rgb = reshape(sscanf(hex(2:end), '%2x') / 255, 1, 3);
end

3. 图例位置调整

参考 legendflex的文档,anchor 参数里设两个数字,表示图片的哪个锚点和图例的哪个锚点对齐,例如,上述例子中 [4 8], 4 表示图片的 east 锚点,8表示图例的 west 锚点。这一步让图例的左侧紧贴图片的右侧。buffer 参数定义图例的偏移量,[10 0]表示让图例向右偏移10个单位。

  • 1 ('nw'): 西北角
  • 2 ('n'): 北边中心
  • 3 ('ne'): 东北角
  • 4 ('e'): 东边中心
  • 5 ('se'): 东南角
  • 6 ('s'): 南边中心
  • 7 ('sw'): 西南角
  • 8 ('w'): 西边中心

如果图例显示不全,可以用 set(gca, 'Position', ...) 调整位置,给图例腾出空间。

参考

### 回答1: 在MATLAB中,可以使用填充纹理来为柱状图添加样式和可视效果。填充纹理可以是颜色、线条或者图像。 对于一个简单的柱状图,可以使用"bar"函数来创建。下面是如何为柱状图添加填充纹理的步骤: 1. 首先,创建一个包含柱状图数据的向量,例如:x = [1, 2, 3, 4, 5]。 2. 然后,使用"bar"函数绘制柱状图:bar(x)。 3. 接下来,用"colormap"函数定义填充颜色。例如,可以使用"autumn"或者"cool"等内置的颜色映射。 4. 最后,使用"colormap"函数来为柱状图填充纹理:colormap('cool')。 另外,如果想要为柱状图添加线条纹理,可以使用"LineStyle"参数。例如,可以将线条设置为点状线条:bar(x,'LineStyle',':')。 如果希望为柱状图添加图像纹理,可以使用"bar3"函数来绘制三维的柱状图,并使用"texturemap"函数来加载和应用图像纹理。通过将图像赋值给"cdata"属性,可以将图像应用到每个柱体上。 总的来说,MATLAB提供了一系列方法来为柱状图添加填充纹理,包括颜色、线条和图像。可以根据个人需求选择适合的方法,以提升柱状图的可视效果。 ### 回答2: 在MATLAB中,可以使用图形对象的属性来为柱状图添加填充纹理。下面是一种方法: 首先,创建柱状图并设置其属性,例如: ```matlab x = 1:10; % 柱状图的x坐标 y = rand(1,10); % 柱状图的高度 bar(x, y); % 创建柱状图 ``` 然后,使用“获得图形句柄”函数(`gca`)获取柱状图的图形句柄,然后使用图形句柄的属性进行填充纹理设置。例如: ```matlab h = gca; % 获取图形句柄 % 设置填充纹理 h.Children.FaceColor = 'flat'; % 设置柱状图的填充颜色为“flat”,表示使用每个柱状图的颜色 h.Children.FaceTexture = 'hatch'; % 设置柱状图的填充纹理类型为“hatch”(其他选项是“diag”和“cross”) h.Children.CDataMapping = 'scaled'; % 设置颜色数据映射为“scaled”,表示每个值通过颜色映射来确定颜色 ``` 通过上述代码,我们将柱状图的填充颜色设置为每个柱子的颜色,填充纹理类型为“hatch”,并且将颜色数据映射为“scaled”。 然后,我们可以再次运行`bar`函数来更新柱形图,以便看到填充纹理的效果。 总结:要在MATLAB中为柱状图添加填充纹理,我们需要获取柱子图形的句柄,并设置其属性来定义填充颜色、填充纹理类型和颜色数据映射。 ### 回答3: 在MATLAB中创建柱状图时,可以通过设置柱状图的填充属性来添加纹理效果。填充纹理可以增强数据的可视化效果和可读性。 要使用填充纹理,首先我们需要创建一个柱状图对象。可以使用bar函数创建柱状图对象,例如:bar(x, y)。在这里,x是柱状图的x轴位置,y是柱状图的高度。接下来,可以使用set函数设置柱状图的填充属性。常见的填充属性包括FaceColor和FaceAlpha。 对于填充纹理,FaceColor属性可以设置为一个纹理矩阵。纹理矩阵通常是一个M x N的矩阵,其中M是柱状图的数量,N是每个柱状图纹理长度。可以使用灰度图像或彩色图像作为纹理矩阵。例如,可以使用imread函数加载一幅图像,并将该图像的灰度矩阵作为柱状图的填充纹理。 同时,FaceAlpha属性用于设置填充纹理的透明度。透明度设置为1表示完全不透明,设置为0表示完全透明。可以通过调整透明度来控制填充纹理的可视化效果。 下面是一个使用纹理填充柱状图的示例代码: ```matlab x = 1:5; y = [45 78 101 63 92]; figure; bar(x, y); % 加载纹理图像 texture = imread('texture.png'); % 设置填充纹理属性 set(gca, 'Color', 'none'); set(bar(x, y), 'FaceColor', 'texturemap', 'CData', texture, 'FaceAlpha', 0.8); % 添加标题和轴标签 title('纹理填充的柱状图'); xlabel('柱状图位置'); ylabel('柱状图高度'); % 设置坐标轴范围 xlim([0.5 5.5]); ylim([0 max(y)+10]); % 设置坐标轴刻度 xticks(x); ``` 在这个示例中,我们加载了一幅名为texture.png的图像作为填充纹理,并将其应用于柱状图。我们还设置了填充纹理的透明度为0.8,使得柱状图的填充纹理可以部分透明地显示。最后,我们还添加了标题、轴标签以及限制了坐标轴的范围和刻度。 通过设置填充纹理属性,我们可以在MATLAB中创建具有纹理填充的柱状图,从而增强数据的可视化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值