Как matplotlib решает, что отображать, когда размер данных больше axis

#python #matplotlib

#питон #matplotlib — файл #python #matplotlib

Вопрос:

Я строю набор данных, в котором размер массивов данных больше размера рисунка, даже больше, чем разрешение моего экрана. Как показано в примере ниже, matplotlib выполняет удивительно хорошую работу по рендерингу данных. Это всего лишь пример набора данных. Мой реальный набор данных гораздо более непредсказуем. У меня есть опасения, что могут быть случаи, когда некоторые важные данные не отображаются. Как matplotlib решает, что показывать?

 x = np.arange(0, 10000)
y = np.zeros(10000)
for i in range(0, 10000, 100):
    y[i] = x[i]
x_spikes = np.random.choice(x, size=10, replace=False)
y[x_spikes] = 10000   x[x_spikes]   
plt.plot(x,y);

print(sorted(x_spikes))
[375, 2828, 3494, 6526, 6855, 6902, 6923, 7117, 7831, 9558]
  

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

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

1. Я не понимаю? Matplotlib показывает все данные? как ваш массив может быть больше размера рисунка?

2. @FChm Спасибо, что спросили. Разрешение моего экрана составляет 1920×1080. Цифра еще меньше. Массив данных содержит 10000 элементов, поэтому не все элементы могут быть отображены.

3. На самом деле я не знаю, что делает matplotlib, но представьте, что он отображает их все — если несколько из них попадают на один и тот же пиксель, это ваша проблема.

Ответ №1:

plt.plot Команда создает один или несколько Line2D объектов. В этих строках есть linewidth . Единицей измерения ширины линии являются точки (по умолчанию используется 1,5 точки).

Следовательно, независимо от разрешения в пикселях отображаются все данные, никакие данные не теряются.

Однако может случиться так, что если вы сделаете ширину линии очень узкой, функции могут быть потеряны из-за сглаживания. Чтобы убедиться, что этого не происходит, вы всегда можете использовать ширину линии, которая составляет не менее ppi / dpi. Т.е. 72 / dpi в случае matplotlib. По умолчанию dpi равен 100. Таким образом, пока ширина линии больше или равна 0.72 точкам, отображаются все точки. (В Juypter часто значение dpi по умолчанию равно 72, следовательно, 72/72 == 1, и потребуется ширина строки 1 .)

Все это относится к строкам. Для столбчатых графиков (где ширина указана в координатах данных) все по-другому. Также изображения могут отображать не все данные, хотя imshow имеет interpolation аргумент, позволяющий управлять поведением интерполяции.

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

1. Спасибо за объяснение. Каков правильный способ вычисления ширины линии в случае столбчатой диаграммы? Например, ширина данных равна 5 миллионам, и я выполняю рендеринг в png-файле с известным размером фигуры?

2. Без необходимости что-либо вычислять, если вы присвоите столбцам ребро, например, plt.bar(..., linewidth=1, edgecolor="black") выполняется тот же аргумент, что и для строк выше, т. е. пока ширина линии больше или равна пикселю, она будет показана. Если вместо этого вы хотите вычислить фактическую ширину строки, это сложно. Вам нужно выяснить долю, которую оси занимают от общего размера рисунка (с помощью параметров subplot), вычислить количество пикселей, которые он содержит (с помощью dpi рисунка), и убедиться, что каждая полоса имеет ширину не менее data range / axes pixel size .