Python Matplotlib使用mW中的数据创建箱线图,使用dBm中的数据进行绘图

Python Matplotlib使用mW中的数据创建箱线图,使用dBm中的数据进行绘图,python,pandas,matplotlib,statistics,boxplot,Python,Pandas,Matplotlib,Statistics,Boxplot,我有一组数据,其中包含以mW为单位的RSSI值和设备标签。参见下面的示例数据 我的目标是创建一个按设备标签分组的平均RSSI的箱线图,但我希望它以对数dBm刻度打印,而不是线性mW刻度 我有一个转换函数: def toDeciBellMilliWatt(RSSI): """Returns RSSI value in dBm, assuming input is mW""" return 10*math.log10(RSSI) 这个调用可以创建箱线图(请注意,我关注这些,因为箱线

我有一组数据,其中包含以mW为单位的RSSI值和设备标签。参见下面的示例数据

我的目标是创建一个按设备标签分组的平均RSSI的箱线图,但我希望它以对数dBm刻度打印,而不是线性mW刻度

我有一个转换函数:

def toDeciBellMilliWatt(RSSI):
    """Returns RSSI value in dBm, assuming input is mW"""
    return 10*math.log10(RSSI)
这个调用可以创建箱线图(请注意,我关注这些,因为箱线和胡须显示分位数,我不关注图),我需要:

但是我希望y轴是dBm。在调用boxplot计算所有分位数后,是否有办法直接实现这一点?不知从何说起

示例数据:

data=pd.DataFrame(列=['label','RSSI'],
数据=['A',1.99e-7],
[B',1.25e-9],
[A',1.99e-5],
[A',3.16e-7],
[B',3.16e-5],
[A',1.99e-7],
[B',3.91e-9],
[A',1.99e-5],
[A',3.14e-7],
[B',3.16e-5]]

编辑以避免混淆:转换为dBm的mW值的平均值不等于dBm值的平均值。这很容易在纸上演示,这是因为dBm是一个对数刻度,而mW不是

当使用以mW为单位的箱线图计算统计值时,我们得到信号的“正确”功率平均值。现在,我错过了在dBm中显示它的部分,以便技术人员能够理解它


我可以自己计算所有的值,然后根据我的计算组装箱线图。我想要的是一个解决方案,将Matplotlib创建的整个箱线图y轴的测量单位转换为对数刻度。

一种方法是首先通过pandas绘制箱线图,然后将y轴设置为对数,并更改刻度的格式。您可以删除次要记号,因为它们与新记号标签混淆

导入数学
作为pd进口熊猫
从matplotlib导入pyplot作为plt
def ToDecibellmWhat(RSSI):
“”“以dBm为单位返回RSSI值,假设输入为mW”“”
返回10*math.log10(RSSI)
def格式_dBm(值、勾号):
返回'-'+str(四舍五入(-ToDecibellMillivatt(值)))
data=pd.DataFrame(列=['label','RSSI'],
数据=['A',1.99e-7],
[B',1.25e-9],
[A',1.99e-5],
[A',3.16e-7],
[B',3.16e-5],
[A',1.99e-7],
[B',3.91e-9],
[A',1.99e-5],
[A',3.14e-7],
[B',3.16e-5]]
图,轴=plt.子批次(ncols=2,figsize=(10,4))
对于轴中的ax:
data.boxplot(column='RSSI',by='label',ax=ax)
plt.子批次调整(wspace=0.25)
plt.yscale('log')
plt.minorticks_off()
轴[1].yaxis.set\u major\u格式化程序(plt.FuncFormatter(format\u dBm))
plt.ylabel('RSSI(以dBm为单位)'
plt.show()
在左边是原始箱线图,在中间是以dBm为单位的y记号标签,在右边是带有对数记号的版本。箱线图因该对数比例而改变其视觉外观


您可以将函数应用于数据并绘制新数据。就这么简单。@ImportanceOfBeingErnest,不,它不是:dBm上的平均值不等于mW上的平均值。我想要的是平均mW,然后将平均值转换为dBm:这是功率平均值更好的近似值。箱线图中没有平均值,对吗?重要的只是数据集中的位置。然而,对于异常值检测,或者如果您想显示平均值,它实际上很重要。这与你的情况有关吗?
data.boxplot(column='RSSI', by='label')