Python 规范化列以将其表示为散点图中的大小

Python 规范化列以将其表示为散点图中的大小,python,matplotlib,Python,Matplotlib,我在dataframe列中有一个值从小到相当大的列:size。我想使用此列作为散点中的大小,如图所示: 使列正常化的最佳方法是什么:大小。我试着把它记录下来,但是大小看起来太相似了。比例仍应代表原始列中的比例。这实际上取决于您希望通过绘图传达的信息 如果缩放尺寸的比例应与原始数据相同,则只能线性缩放尺寸。如果允许非线性缩放,则必须确定压缩/扩展输入数据的位置,以便在这些区域中,输入值x的圆圈大小不是输入值x/2的两倍 我将假设您要绘制的最大尺寸为500,即max(size)=500,输入数据的最

我在dataframe列中有一个值从小到相当大的列:size。我想使用此列作为散点中的大小,如图所示:


使列正常化的最佳方法是什么:大小。我试着把它记录下来,但是大小看起来太相似了。比例仍应代表原始列中的比例。

这实际上取决于您希望通过绘图传达的信息

如果缩放尺寸的比例应与原始数据相同,则只能线性缩放尺寸。如果允许非线性缩放,则必须确定压缩/扩展输入数据的位置,以便在这些区域中,输入值
x
的圆圈大小不是输入值
x/2
的两倍

我将假设您要绘制的最大尺寸为500,即
max(size)=500,输入数据的最大值为2000,但实际值并不重要

我创建了一个带有一些选项的绘图

对于线性缩放(绿色曲线),您只需找到输入数据的最大值,然后使用
size=input_data*500/max_val
进行缩放

您还可以使用
tanh
函数的不同变体进行缩放。例如,如果要在某个阈值以下用较小的圆绘制数据,在该阈值以上用较大的圆绘制数据,可以选择类似蓝色曲线的内容。通过将
tanh(x/500-2)*250+250
更改为
tanh(x/50-20)*250+250
,可以使曲线更加陡峭

tanh解决方案有一个很好的特性,即非常大的输入值仍然映射到最大大小500。例如,如果使用抛物线缩放,圆的大小将无限增长,则这不起作用。例如,如果您的输入数据范围为0到10^6,但您只希望将更改可视化到2000,并且所有大于2000的值都应具有相同的大小,则tanh缩放可以帮助您实现这一点


如果没有一些实际数据,很难预测哪种缩放方式最适合您。

这实际上取决于您希望通过绘图传达的信息

如果缩放尺寸的比例应与原始数据相同,则只能线性缩放尺寸。如果允许非线性缩放,则必须确定压缩/扩展输入数据的位置,以便在这些区域中,输入值
x
的圆圈大小不是输入值
x/2
的两倍

我将假设您要绘制的最大尺寸为500,即
max(size)=500,输入数据的最大值为2000,但实际值并不重要

我创建了一个带有一些选项的绘图

对于线性缩放(绿色曲线),您只需找到输入数据的最大值,然后使用
size=input_data*500/max_val
进行缩放

您还可以使用
tanh
函数的不同变体进行缩放。例如,如果要在某个阈值以下用较小的圆绘制数据,在该阈值以上用较大的圆绘制数据,可以选择类似蓝色曲线的内容。通过将
tanh(x/500-2)*250+250
更改为
tanh(x/50-20)*250+250
,可以使曲线更加陡峭

tanh解决方案有一个很好的特性,即非常大的输入值仍然映射到最大大小500。例如,如果使用抛物线缩放,圆的大小将无限增长,则这不起作用。例如,如果您的输入数据范围为0到10^6,但您只希望将更改可视化到2000,并且所有大于2000的值都应具有相同的大小,则tanh缩放可以帮助您实现这一点


如果没有一些实际数据,很难预测哪种缩放最适合您。

您能分享一些有代表性的数据吗?那将是非常抱歉的。您能分享一些有代表性的数据吗?那将是非常抱歉的。
import matplotlib.pyplot as plt
import numpy as np

n = 50
x = np.random.randn(n)
y = x * np.random.randn(n)

fig, ax = plt.subplots(2, figsize=(6, 6))

ax[0].scatter(x, y, s=50)

sizes = (np.random.randn(n) * 8) ** 2
ax[1].scatter(x, y, s=sizes)

fig.show()