散点图显示多数并包括极值
Posted
技术标签:
【中文标题】散点图显示多数并包括极值【英文标题】:Scatter plot to show the majorities and include extreme numbers 【发布时间】:2022-01-07 08:03:02 【问题描述】:简单数据如下,我想把它们放在散点图中。
如果没有异常值(即非常大的数字),一切顺利。
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以下的散点分布,并注意存在极值。
谢谢。
【问题讨论】:
您可以使用对数刻度。真正的问题是你想在这张图中传达什么信息? @mozway,感谢您的评论。图表的读者不了解对数刻度的概念,因此最好保持 y 轴正常。 @mozway,图表的目的是显示和关注10000以下(数字)的散点分布,并注意存在极端数字。 【参考方案1】:如果您不想使用对数刻度,可以将绘图分成两个(或更多)并绘制低于/高于阈值的值:
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)
输出:
【讨论】:
哇!惊人的!我从来没有想过这个。谢谢!以上是关于散点图显示多数并包括极值的主要内容,如果未能解决你的问题,请参考以下文章