散点图显示多数并包括极端数字

Scatter plot to show the majorities and include extreme numbers

下面的简单数据,我想把它们放在散点图中。

如果没有异常值(即非常大的数字),一切顺利。

import pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

dates = ["2021-01-01",
"2021-01-01", "2021-01-06",
"2021-01-08", "2021-01-12",
"2021-02-01", "2021-02-11",
"2021-02-12", "2021-02-15",
"2021-02-16", "2021-03-11",
"2021-03-21", "2021-03-22",
"2021-03-23", "2021-03-24",
"2021-04-02", "2021-04-12",
"2021-04-22", "2021-04-26",
"2021-04-30"]

numbers= [6400,
5100,5000,
4000,3686,
9000,8050,
8000,6050,
6000,9000,
8500,7800,
7000,6000,
10000,9600,
8000,7883,
6686]

dates = [pd.to_datetime(d) for d in dates]

plt.scatter(dates, numbers, s =100, c = 'red')
plt.show()

但是当有一个或多个极端数字时,例如最后一个数字 6686 变成 66860。新图显示大部分散点不显着(因为新的 y 轴)。

像以前一样绘制散点图(保持 y 轴不变)并且仍然可视化极值的好解决方案是什么?

图表的目的是显示和关注 10000 以下的散点分布,并注意存在极端数字。

谢谢。

如果您不想使用对数刻度,可以将图一分为二(或更多)并绘制值 below/above 阈值:

df = pd.DataFrame({'num': numbers}, index=dates)
thresh = 12000

f, (ax1, ax2) = plt.subplots(nrows=2, sharex=True,
                             gridspec_kw={'height_ratios': (1,3)},
                             figsize=(10,4)
                            )

lows  = df.mask(df['num'].ge(thresh))
highs = df.mask(df['num'].lt(thresh))

ax2.scatter(df.index, lows)
ax1.scatter(df.index, highs)

输出: