【Matlab】指定纵坐标开始的悬浮+分段+填充柱状图代码

写文章的时候想画一个不同参数下带宽变化的图,不想直接画s参数图乱糟糟的也不直观,所以想用matlab搞个柱状图。暂时没找到matlab画悬浮柱状图的方法,只能用patch函数试试了。

记性不好的编程白痴画图画得脑壳疼...

1. 初始代码

%柱状图柱子的宽度
w=0.5; 
%柱状图的起点1 3 -1和终点12 17 1
v=[1 3 -1;12 17 1];
[K,N]=size(v);
%先画一个顶点x坐标为[0 1 1 0 0] y坐标为[0 0 1 1 0]
sq_x=[0;1;1;0;0];
sq_y=[0;0;1;1;0];
a=w*[1;1;1;1;1];
%画所需要的柱子的横纵坐标 具体参见patch和diff函数
patch(a+sq_x*0.5+(1:N),sq_y*diff(v)+v(1,:),'b'); 
hold on
%画第二列 改变横坐标即可
patch(sq_x*0.5+(1:N),sq_y*diff(v)+v(1,:),'k');      
hold on
%画第二排 改变纵坐标即可
patch(sq_x*0.5+(1:N),sq_y*diff(v)+v(1,:)+20,'r');  
hold off

但是这样画出来的图长这样好丑啊,想着说能不能搞点不同图案的填充,而不是这种大面积的图块

2. 柱状图/patch填充

matlab好像是没有自带hatchfill的函数的,要去matlab file exchange里面下别人写的函数,解决办法在下面的问题里面看到的

Getting hatchfill to properly display a patch legend - MATLAB Answers - MATLAB Central

按照这个问题下面回答的步骤来说,要先去下压缩包

1. Hatchfill2:Hatchfill2 - File Exchange - MATLAB Central

2. Legendflex:legendflex.m: a more flexible, customizable legend - File Exchange - MATLAB Central

虽然不知道这两个函数各自啥意思,能用就行哈哈哈。填充图案以及填充图案的颜色都可以改变,而且可以实现各种类型图的填充(见hatchfill2下载下来的压缩包里面的demo),应该是够用了。

我也尝试了一下applyhatch_plusC函数,applyhatch_plus不需要额外的legend函数但是清晰度堪忧,而且直接生成图片。

3. 具体实现过程

1)下载函数压缩包

hatchfill2:

Legendflex:

legendflex的压缩包含两个函数,一个在legendflex文件夹里面,一个在setgepos_V1.2

反正记得所有.m文件都放在跟自己画图的.m文件一个目录下,不然可能会报错。如果要跑hatchfill2 demo还记得把数据文件hatchfill2_demo_data.mat也复制出来。

2)代码

clc
close all
clear all

%这些跟初始代码一样画
w=0.5;           
v=[1 3 -1;12 17 1];  
[K,N] = size(v);
p=2;             
sq_x=[0;1;1;0;0];   
sq_y=[0;0;1;1;0];   
a=w*[1;1;1;1;1];   

%patch+hatchfill2
hp1=patch(a+sq_x*0.5+(1:N),sq_y*diff(v)+v(1,:),'g','LineWidth',1,'EdgeColor',[0.1,0.1,0.1],'Facecolor','none'); %多了一些边框颜色线宽填充颜色的设置
hatchfill2(hp1,'single','HatchAngle',45,'HatchColor','b'); %具体hatchfill2填充可以见hatchfill2.m和hatchfill2_demo.m里面的内容
hold on

hp2=patch(sq_x*0.5+(1:N),sq_y*diff(v)+v(1,:),'k','LineWidth',1,'EdgeColor',[0.1,0.1,0.1],'Facecolor',[0.5,0.5,0.5]);
%hatchfill2(hp2,'single','HatchAngle',45,'HatchColor','r');
hold on

hp3=patch(sq_x*0.5+(1:N),sq_y*diff(v)+v(1,:)+20,'r','LineWidth',1,'EdgeColor',[0.1,0.1,0.1],'Facecolor','none');
hatchfill2(hp3,'cross','HatchAngle',0,'HatchColor','r');
hold off

%画legend
hp=[hp1 hp2 hp3];
legendData = {'Legend 1','Legend 2','Legend 3'};
%除了设置的字体这些的东西,具体还能设置别的可以参见legendflex.m的内容
[legend_h, object_h, plot_h, text_str] = legendflex(hp, legendData,...
    'FontSize', 7,'FontWeight', 'bold','Fontname', 'Times New Roman','xscale',0.5,'box','off');
hatchfill2(object_h(4), 'single', 'HatchAngle', 45, 'HatchDensity', 10, 'HatchColor', 'b');
%hatchfill2(object_h(5), 'single', 'HatchAngle', 75, 'HatchDensity', 8, 'HatchColor', 'b');
hatchfill2(object_h(6), 'cross', 'HatchAngle', 0, 'HatchDensity', 10, 'HatchColor', 'r');

%下面是对坐标的一些设置
set(gca,'Fontname', 'Times New Roman','FontSize',7.5,"FontWeight","bold")
set(gca,'Xgrid','off','Linewidth',0.8,'Gridalpha',0.5);  
pbaspect([1.55 1 1])
set(gcf,'unit','centimeters','position',[10 5 8.6 6.4]);   

3)好看多了诶! 

4. 最后我的图长这样,matlab画图有点东西

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值