matplotlib 参数,matplotlib画坐标系
本文主要介绍Matplotlib直方图绘制中参数bin和rwidth的实现。通过示例代码详细介绍,对大家的学习或工作有一定的参考价值。让我们和边肖一起学习。
00-1010场景引入箱参数堆叠参数rwidth参数参考
目录
我们在做机器学习相关项目的时候,经常会分析数据集的样本分布,这就需要绘制直方图。
可以在Python中轻松调用matplotlib.pyplot的hist函数来绘制直方图。但是这个函数的参数很多,画图的几个小细节也需要注意。
首先,我们假设有一个联邦研究项目。我们有一个图片数据集,有15个样本,4个样本标签,分别是猫、狗、车、船。这个数据集被不均匀地分成四个任务节点(客户端)。情景介绍
我们在做机器学习相关项目的时候,经常会分析数据集的样本分布,这就需要绘制直方图。
可以在Python中轻松调用matplotlib.pyplot的hist函数来绘制直方图。但是这个函数的参数很多,画图的几个小细节也需要注意。
首先,我们假设有一个联邦研究项目。我们有一个图片数据集,有15个样本,4个样本标签,分别是猫、狗、车、船。该数据集被不均匀地分为四个任务节点(客户端),如下所示:
n个客户端=3
num_cls,classes=4,[猫,狗,车,船]
Train _ labels=[0,3,2,0,3,2,1,0,3,3,1,0,3,2,2] #数据集标签列表
client_idcs=[slice(0,4),slice(4,11),slice(11,15)]
#客户端数据集样本的划分
我们需要可视化任务节点中样本的分布。第一次,我们可能会编写以下代码:
将matplotlib.pyplot作为plt导入
将numpy作为np导入
plt.figure(figsize=(5,3))
PLT . hist([client _ idc中IDC的train _ labels[IDC]),stacked=False,
bins=num _ cls,
label=[“客户端{}”。范围内I的格式(I)(N _ CLIENTS)])
plt.xticks(np.arange(num_cls),类)
plt .图例()
plt.show()
此时的可视化结果如下:
这时候我们会发现我们X轴上的标签和上面的条没有对齐(每个图像类别对应的三个条统称为一个bin),这时候就需要调整bins参数了。
情景引入
在讨论bin参数之前,我们先熟悉一下hist绘图中bin和bar的含义。以下是他们的解释:
这里(x1 )和(x2 )是X轴对象。在hist中,X轴上第一个对象的默认刻度为0,第二个对象的刻度为1,类图依次为。在这个说明图中,bin(意为垃圾桶)是指由每个X轴对象支配的矩形绘图区域,bar(意为块)是指每个矩形绘图区域中的条。如上图所示,X轴上第一个对象对应的bin区间为[-0.5,0.5],第二个对象对应的bin区域为[0.5,1](注意hist规定必须左闭右开)。每个对象的bin区域有3个条形。
通过查阅matplotlib文档,我们知道bin参数的解释如下:
bins: int或sequence或str,default : RC params[ hist . bins ](default : 10)
If bins is an integer, it defines the number of equal-width bins in the range.
If bins is a sequence, it defines the bin edges, including the left edge of the first bin and the right edge of the last bin; in this case, bins may be unequally spaced. All but the last (righthand-most) bin is half-open. In other words, if bins is:
[1, 2, 3, 4]
then the first bin is [1, 2) (including 1, but excluding 2) and the second [2, 3). The last bin, however, is [3, 4], which includes 4.
If bins is a string, it is one of the binning strategies supported by numpy.histogram_bin_edges: 'auto', 'fd', 'doane', 'scott', 'stone', 'rice', 'sturges', or 'sqrt'.
我来概括一下,也就是说如果bins
是个数字,那么它设置的是bin的个数,也就是沿着x轴划分多少个独立的绘图区域。我们这里有四个图像类别,故需要设置4个绘图区域,每个区域相对于x轴刻度的偏移采取默认设置。
不过,如果我们要设置每个区域的位置偏移,我们就需要将bins
设置为一个序列。
bins
序列的刻度要参照hist
函数中的x坐标刻度来设置,本任务中4个分类类别对应的x轴刻度分别为[0, 1, 2, 3]
。如果我们将序列设置为[0, 1, 2, 3, 4]
就表示第一个绘图区域对应的区间是[1, 2)
,第2个绘图区域对应的位置是[1, 2)
,第三个绘图区域对应的位置是[2, 3)
,依次类推。
就大众审美而言,我们想让每个区域的中心和对应x轴刻度对齐,这第一个区域的区间为[-0.5, 0.5)
,第二个区域的区间为[0.5, 1.5)
,依次类推。则最终的bins
序列为[-0.5, 0.5, 1.5, 2.5, 3.5]
。于是,我们将hist
函数修改如下:
plt.hist([train_labels[idc]for idc in client_idcs], stacked=False,
这样,每个划分区域和对应x轴的刻度就对齐了:
stacked参数
有时x轴的项目多了,每个x轴的对象都要设置3个bar对绘图空间无疑是一个巨大的占用。在这个情况下我们如何压缩空间的使用呢?这个时候参数stacked
就派上了用场,我们将参数stacked
设置为True
:
plt.hist([train_labels[idc]for idc in client_idcs],stacked=True
可以看到每个x轴对象的bar都叠加起来了:
不过,新的问题又出来了,这样每x轴对象的bar之间完全没有距离了,显得十分拥挤,我们可否修改bins
参数以设置区域bin之间的间距呢?答案是不行,因为我们前面提到过,bins
参数中只能将区域设置为连续排布的。
换一个思路,我们设置每个bin内的bar和bin边界之间的间距。此时,我们需要修改r_width
参数。
rwidth 参数
我们看文档中对rwidth
参数的解释:
rwidth float or None, default: None
The relative width of the bars as a fraction of the bin width. If None, automatically compute the width.
Ignored if histtype is 'step' or 'stepfilled'.
翻译一下,rwidth
用于设置每个bin中的bar相对bin的大小。这里我们不妨修改为0.5:
plt.hist([train_labels[idc]for idc in client_idcs],stacked=True,
修改之后的图表如下:
可以看到每个x轴元素内的bar正好占对应bin的宽度的二分之一。
引用
[1] https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist.html
到此这篇关于Matplotlib直方图绘制中的参数bins和rwidth的实现的文章就介绍到这了,更多相关Matplotlib bins rwidth内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。