Matlab绘图------特殊图形------直方图

一、hist函数

(1)hist(x),其中x是一维向量,该函数是将x的最小值与最大值之间的区间等分为10份,输出的直方图横坐标为x,纵坐标为相应区间数值的个数。相当于hist(x,10)。从下图可以测试,可以看出两种用法是相同的。

Matlab绘图------特殊图形------直方图_第1张图片Matlab绘图------特殊图形------直方图_第2张图片

(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),得到下面的图表:

Matlab绘图------特殊图形------直方图_第3张图片

二、bar函数

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)

Matlab绘图------特殊图形------直方图_第4张图片

可以看到,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)

得到了下图:

Matlab绘图------特殊图形------直方图_第5张图片

(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');

得到:

Matlab绘图------特殊图形------直方图_第6张图片

总结:可以看到,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)布尔值转换为数值型

两种方法

  • 强制转换:double(x)
  • 自动转换:当逻辑值参与数学运算时会自动转为数值型

比如下面的例子:
 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 得到下面的情况:
Matlab绘图------特殊图形------直方图_第7张图片

所以,这里需要构造一个函数,这可以以下的连接中找到: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年'});

 

Matlab绘图------特殊图形------直方图_第8张图片

那么,如何将下面的这幅图下标1 2 3换成 小明 小红 小黑 呢?

Matlab绘图------特殊图形------直方图_第9张图片

只需要一个简单的操作即可:

 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',{'小明','小红','小黑'})

最终得到了下面的图像:

Matlab绘图------特殊图形------直方图_第10张图片

大功告成,至此关于绘制直方图的两个函数hist函数和bar函数,以及一些零碎的知识点已经全部完成,下一步将进行更加美观高大上的位图和其他高深的图像前进,加油!

你可能感兴趣的:(Matlab)