matlab使用教程(48)—绘制直方图

1.使用二元直方图进行颜色分析

        此示例说明如何调整二元直方图的色阶,以显示与 bin 有关的更多详细信息。加载图像 peppers.png ,这张彩色照片显示了几种辣椒和其他一些蔬菜。8 位无符号整数数组 rgb 包含
图像数据。
rgb = imread('peppers.png');
imshow(rgb)

        为每个像素的红、绿 RGB 值绘制二元直方图,以可视化形式呈现颜色分布。


r = rgb(:,:,1);
g = rgb(:,:,2);
b = rgb(:,:,3);
histogram2(r,g,'DisplayStyle','tile','ShowEmptyBins','on', ...
 'XBinLimits',[0 255],'YBinLimits',[0 255]);
axis equal
colorbar
xlabel('Red Values')
ylabel('Green Values')
title('Green vs. Red Pixel Components')

        此直方图明显趋向于色阶底部,原因是有些 bin 的计数很大。这导致大部分 bin 在颜色图中显示为第一种颜色,即蓝色。如果没有提供更多详细信息,很难得出关于哪种颜色更占主导性的结论。要查看更多详细信息,请通过将坐标区的 CLim 属性设置为介于 0 和 500 之间的范围,重新调整直方图的色阶。其结果就是直方图中计数达到 500 或以上的 bin 在颜色图中显示为最后一种颜色,即黄色。由于大部分 bin 的计数在这个较小范围内,因此所显示的 bin 的颜色变化较大。
ax = gca;
ax.CLim = [0 500];

        使用类似的方法可以比较红色与蓝色以及绿色与蓝色的主导性。
histogram2(r,b,'DisplayStyle','tile','ShowEmptyBins','on',...
'XBinLimits',[0 255],'YBinLimits',[0 255]);
axis equal
colorbar
xlabel('Red Values')
ylabel('Blue Values')
title('Blue vs. Red Pixel Components')
ax = gca;
ax.CLim = [0 500];

histogram2(g,b,'DisplayStyle','tile','ShowEmptyBins','on',...
'XBinLimits',[0 255],'YBinLimits',[0 255]);
axis equal
colorbar
xlabel('Green Values')
ylabel('Blue Values')
title('Green vs. Blue Pixel Components')
ax = gca;
ax.CLim = [0 500];

        在每种情况下,蓝色都是最不占主导性的颜色信号。看看所有这三个直方图,红色似乎为主导颜色。在 RGB 颜色空间中创建一个颜色直方图,对结果进行确认。对于所有这三个颜色分量,较小的 RGB 值都有峰值。但相比其他任何分量,100 以上的值更多出现在红色分量中。
histogram(r,'BinMethod','integers','FaceColor','r','EdgeAlpha',0,'FaceAlpha',1)
hold on
histogram(g,'BinMethod','integers','FaceColor','g','EdgeAlpha',0,'FaceAlpha',0.7)
histogram(b,'BinMethod','integers','FaceColor','b','EdgeAlpha',0,'FaceAlpha',0.7)
xlabel('RGB value')
ylabel('Frequency')
title('Color histogram in RGB color space')
xlim([0 257])

2.使用直方图进行数据分类

        此示例说明如何使用 histogram 有效查看分类数据。可以使用名称-值对组 'NumDisplayBins''DisplayOrder' 'ShowOthers' 更改分类直方图的显示。这些选项有助于您更好地整理数据和减少绘图中的噪点。

2.1创建分类直方图

        示例文件 outages.csv 包含表示美国电力中断情况的数据。该文件包含六个列: Region
OutageTime Loss Customers RestorationTime Cause。以表的形式读取 outages.csv 文件。使用 'Format' 选项指定每列包含的数据类型:分类 ( '%C')、浮点数( '%f' ) 或日期时间 ( '%D' )。对数据的前几行进行索引以查看变量。
data_formats = '%C%D%f%f%D%C';
C = readtable('outages.csv','Format',data_formats);
first_few_rows = C(1:10,:)

first_few_rows=10×6 table
Region OutageTime Loss Customers RestorationTime Cause
_________ ________________ ______ __________ ________________ _______________
SouthWest 2002-02-01 12:18 458.98 1.8202e+06 2002-02-07 16:50 winter storm
SouthEast 2003-01-23 00:49 530.14 2.1204e+05 NaT winter storm
SouthEast 2003-02-07 21:15 289.4 1.4294e+05 2003-02-17 08:14 winter storm
West 2004-04-06 05:44 434.81 3.4037e+05 2004-04-06 06:10 equipment fault
MidWest 2002-03-16 06:18 186.44 2.1275e+05 2002-03-18 23:23 severe storm
West 2003-06-18 02:49 0 0 2003-06-18 10:54 attack
West 2004-06-20 14:39 231.29 NaN 2004-06-20 19:16 equipment fault
West 2002-06-06 19:28 311.86 NaN 2002-06-07 00:51 equipment fault
NorthEast 2003-07-16 16:23 239.93 49434 2003-07-17 01:12 fire
MidWest 2004-09-27 11:09 286.72 66104 2004-09-27 16:37 equipment fault
        绘制 Cause 变量的分类直方图。指定一个输出参数以返回直方图对象的句柄。
h = histogram(C.Cause);
xlabel('Cause of Outage')
ylabel('Frequency')
title('Most Common Power Outage Causes')

        将直方图的归一化方式更改为使用 'probability' 归一化,它显示每种断电原因的相对频率。
h.Normalization = 'probability';
ylabel('Relative Frequency')

2.2更改显示顺序

        使用 'DisplayOrder' 选项按从大到小的顺序对 bin 排序。
h.DisplayOrder = 'descend';

2.3截断显示的条形数

        使用 'NumDisplayBins' 选项仅在绘图中显示三个条形。由于对未显示的数据仍考虑了归一化,因此所显示的概率相加不再为 1。
h.NumDisplayBins = 3;

2.4将被排除的数据相加

        使用 'ShowOthers' 选项合并显示所有被排除的条形,以使所显示的概率相加后再次等于 1。
h.ShowOthers = 'on';

2.5限制只对显示数据进行归一化

        在 R2017a 之前的版本中,histogramhistcounts 函数仅使用经过 bin 处理的数据来计算归一化。这种行为意味着如果部分数据最终位于 bin 外面,则在归一化时会被忽略。但在 MATLAB® R2017a 中,该行为改为始终使用输入数据中的总元素数目来进行归一化。这种新行为更为直观,但如果您更愿意采用旧行为,则需要采取几个特殊步骤来限制仅对经过分 bin 处理的数据进行归一化。您可以限制只对直方图中显示的数据实施概率归一化,而不是对所有输入数据均进行归一化。只需更新直方图对象的 Data 属性,删除其他类别即可。 Categories 属性将反映直方图中显示的类别。使用 setdiff 比较这两个属性值,并从 Data 中删除不在 Categories 中的所有类别。然后从数据中删除得到的所有undefined 分类元素,仅保留所显示类别中的元素。
h.ShowOthers = 'off';
cats_to_remove = setdiff(categories(h.Data),h.Categories);
h.Data = removecats(h.Data,cats_to_remove);
h.Data = rmmissing(h.Data);

  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

配电网和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值