(1)hist(x),其中x是一维向量,该函数是将x的最小值与最大值之间的区间等分为10份,输出的直方图横坐标为x,纵坐标为相应区间数值的个数。相当于hist(x,10)。从下图可以测试,可以看出两种用法是相同的。
(2)[a,b] = hist(x,n):这里是将区间分为n份,横坐标是x,纵坐标是个数。a为落在该区间的个数,b为该区间中心线位置坐标。其中,[a,b] = hist(x,6)不画图,只输出结果;hist(x,6)不输出结果,只画图。
下面演示一下:
[a,b]=hist(x,5)
a =
3 0 4 3 1
b =
0.1440 0.3120 0.4800 0.6480 0.8160
当输入:hist(x,5),得到下面的图表:
bar函数画直方图有四种可用的形式:
bar,bar3,barh 和bar3h,其中bar 和bar3 分别用来绘制二维和三维竖直方图,barh 和b
ar3h 分别用来绘制二维和三维水平直方图,调用格式如下:
(1)bar(y):其中y为矩阵,矩阵有几行就有几组,几列就表示每个小组内有几个分组;示例如下:
y=[5 4 3 2 9;4 8 7 2 7;1 9 5 7 3];
>> bar(y)
可以看到,y为3行5列的矩阵,则应用bar函数后得到的直方图是分成了3组5列;所以bar(y)得到的图像就是按照y的行和列进行绘制的;
(2)bar(x,y)函数:
其中x 必须单调递增或递减,y 为n*m的矩阵,可视为结果为m组,每
组n个垂直柱,也就是把y 的行画在一起,同一列的数据用相同的颜色表示;
可以看到,bar(x,y)就是将bar(y)进行了扩展,但是x必须是单调的,且x的元素个数必须和y的行数匹配,如下面就出现了错误:
y=[5 3 2 9;4 7 2 7;1 5 7 3];
>> x=[3 4 5];
>> bar(x,y)
>> x=[3 4 5 6];
>> bar(x,y)
错误使用 bar (line 168)
X 的长度必须与 Y 的行数匹配。
(3)bar(x,y,width) (或者是bar(y,width))指定每个直方条的宽度,如width>1,则直方条会重
叠,默认值为width=0.8;
y=[5 3 2 9;4 7 2 7;1 5 7 3];
x=[3 4 5];
>> bar(x,y,1.2)
得到了下图:
(4)ba(...,’grouped’) 使同一组直方条紧紧靠在一起;
(5) bar(…,’stack’) 把同一组数据描述在一个直方条上。
如下列所示:
输入:
y=[5 3 2 9;4 7 2 7;1 5 7 3];
x=[3 4 5];
bar(y,'stack');
得到:
总结:可以看到,bar(y)和bar(x,y)两个用法是一样的,可以直接使用bar(y),不必使用bar(x,y)这一麻烦用法;
但是有一个是需要注意的:当对横坐标x没有要求时,可以直接使用bar(y);而如果涉及到修改x轴,那么就需要使用bar(x,y)
另外,对比一下hist()函数和bar()函数,可以发现,hist()函数使用中,需要对横坐标进行等分,即分组操作;而bar()函数直接按照y的列数确定横坐标的分组,y有多少列,那么横坐标就分成几个组,所以猜想:当x横坐标指定为字符类型时,怎么操作呢?
x=['小明','小强','小黑'];
>> y=[5 3 2 9;4 7 2 7;1 5 7 3];
那么绘制的时候会出现什么问题呢:
bar(x,y)后:
得到:错误使用 bar (line 41)
输入参数的数目不足。
那么怎么才能达到想要的效果呢?那么这就涉及到了数据类型之间的相互转换了。http://blog.sina.com.cn/s/blog_542a1e4a0100sjpp.html
在上面的一篇文章中,就细细的讲述了Matlab中数据类型的细节
那么本文主要是讲述整理数据类型之间的类型转换:
(1)数值型转换成布尔类型
数值型数据转换成逻辑型的数据一般遵循以下规则:非0的数值型数据转换成逻辑真,即1;等于0的数值转换成逻辑假,即0。主要使用的是logical()函数:
num=12;
>> n=logical(num)
n =
logical
1
(2)布尔值转换为数值型
两种方法
比如下面的例子:
n=logical(12);
>> num=double(n);
>> n
n =
logical
1
>> num
num =
1
(3)字符型转换为数值型
a='hello';
>> b=double(a)
b =
104 101 108 108 111
(4)字符数组转换成字符串
使用cellstr函数
a='hello';
>> b=cellstr(a)
b =
1×1 cell 数组
{'hello'}
(5)用字符串作为变量名
使用eval()函数,可以将字符串转换成变量名,如下面所示:
str_var = 'varNumber';
eval( [str_var, '= 20']);
varNumber =
20
上例中,首先定义了一个变量str_var,变量值为‘varNumber’,然后使用eval函数将str_var的变量值转换成了一个新的变量,其变量值为20,所以可以在工作空间内看到多了一个变量varNumber
(6)变量名转换为字符串
这里需要用到inputname()函数,但是直接想(5)中使用inputname 得到下面的情况:
所以,这里需要构造一个函数,这可以以下的连接中找到:https://blog.csdn.net/humanking7/article/details/80628757
那么,到这里发现还是不能完成之前的设想,那么到底如何才能使得横坐标设置为汉字类的形式呢?就如下面的展示的那样:
那么,下面就开始进行探索:
x=2000:2015;
>> y=sin(x);
>> plot(x,y,'-*')
>> set(gca,'xTick',[2000:3:2015])
>> set(gca,'xTicklabel',{'2000年','2003年','2006年','2009年','2012年','2015年'});
那么,如何将下面的这幅图下标1 2 3换成 小明 小红 小黑 呢?
只需要一个简单的操作即可:
x=[1 2 3];
>> y=[2 4 5 9 5;12 23 5 13 10;11 9 18 16 12];
>> bar(x,y)
>> set(gca,'xTicklabel',{'小明','小红','小黑'})
最终得到了下面的图像:
大功告成,至此关于绘制直方图的两个函数hist函数和bar函数,以及一些零碎的知识点已经全部完成,下一步将进行更加美观高大上的位图和其他高深的图像前进,加油!