#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. ух ты! потрясающе! Я никогда об этом не думал. Спасибо!