写文章的时候想画一个不同参数下带宽变化的图,不想直接画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画图有点东西