在我尝试在散点图上绘制的一组数据点中,有几个巨大的异常点。作为参考,大多数值的范围在 0-100 之间,但偶尔会出现 100000 的异常点。因此,当我在散点图、箱线图或任何图上绘制图表时,它会缩小太多以适应所有情况0-100 之间 99% 的点看起来就像一个小点。有什么方法可以对其进行缩放,以便相应地缩放前 99% 的点,并让缩放跳至异常点的值,使其适合图表?
图表如下:
箱线图:
散点图:
根据您的限制使用 plt.axis() 函数。
plt.axis([x_min, x_max, y_min, y_max]) 其中 x_min、x_max、y_min 和 y_max 是两个轴的坐标限制
您可以设置 x/y 轴刻度来记录或仅设置 x/y 限制(例如使用
plt.xlim(0,200)
)以隐藏图表中的异常情况:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style('whitegrid')
plt.figure(figsize=(20,12))
data = [1,2,3,4,5,55,1,6,7,24,67,33,41,75,100_000,1_000_000]
plt.subplot(2,2,1)
plt.title('basic boxplot')
sns.boxplot(x=data, flierprops=dict(markerfacecolor='green', markersize=7))
plt.subplot(2,2,2)
plt.title('log x axis')
b = sns.boxplot(x=data, flierprops=dict(markerfacecolor='red', markersize=7))
b.set_xscale('log')
plt.subplot(2,2,3)
plt.title('basic scatter')
hue = ['outlier' if i > 100 else 'basic sample' for i in data]
sns.scatterplot(x=data, y=data, hue=hue)
plt.subplot(2,2,4)
plt.title('log x/y scatter')
s = sns.scatterplot(x=data, y=data, hue=hue)
s.set_xscale('log')
s.set_yscale('log')
plt.show()
outset
库可以帮助进行多尺度可视化以解释大量异常值。
绘制所有数据,包括离群值,然后缩放面板仅显示非离群值。
# adapted from https://stackoverflow.com/a/72778992/17332200
import matplotlib.pyplot as plt
import numpy as np
import outset as otst
import pandas as pd
import seaborn as sns
# Data Preparation
xdata = [1, 2, 3, 4, 5, 55, 1, 6, 7, 24, 67, 33, 41, 75, 100_000, 1_000_000]
ydata = xdata[1:] + xdata[:1] # slightly vary from x coords for nice plot
outlier_thresh = 200
data = pd.DataFrame({"x": xdata, "y": ydata})
data["outlier"] = (data["x"] > outlier_thresh) | (data["y"] > outlier_thresh)
# Initialize an OutsetGrid object
outset_grid = otst.OutsetGrid(
data=data,
x="x",
y="y",
col="outlier", # split plots based on outlier status
col_order=[False], # only magnify non-outlier data
marqueeplot_source_kws={ # style zoom indicator elements
"leader_stretch": 0.5,
"leader_stretch_unit": "inches",
},
)
outset_grid.map_dataframe(sns.scatterplot, x="x", y="y")
otst.inset_outsets(outset_grid) # rearrange move outset axes on top of source
outset_grid.marqueeplot() # render marquee annotations
这个两轴网格可以轻松地重新排列成插图。
只需在显示或保存之前添加以下行,
# rearrange to move outset axes on top of source
otst.inset_outsets(outset_grid)
outset.inset_outsets
提供 kwarg 选项来微调插入位置(如果需要)。
要安装起始库,
python3 -m pip install outset
。
除了上面显示的面向数据的缩放区域选择之外,该库还提供了显式 API 来手动指定缩放区域以及许多样式和布局选项。
披露:我是图书馆作者