Точечная диаграмма для отображения большинства и включения экстремальных чисел

#python #matplotlib #scatter-plot

#питон #matplotlib #точечная диаграмма

Вопрос:

Простые данные, как показано ниже, и я хочу поместить их в точечную диаграмму.

Все идет хорошо, если нет выбросов (т. Е. Чрезвычайно больших чисел).

 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, а также отметить, что есть экстремальные числа.

Спасибо.

Комментарии:

1. Вы могли бы использовать логарифмическую шкалу. Реальный вопрос заключается в том, какую информацию вы хотите передать на этом графике?

2. @mozway, спасибо за ваш комментарий. читатели диаграммы не понимают концепцию логарифмического масштаба, поэтому предпочтительно сохранить ось y как обычно.

3. @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)  

выход:

введите описание изображения здесь

Комментарии:

1. ух ты! потрясающе! Я никогда об этом не думал. Спасибо!