Уменьшите размер на диске векторизованной диаграммы рассеяния со многими перекрывающимися точками и альфа - PullRequest
0 голосов
/ 08 марта 2019

При построении точечных диаграмм в matplotlib и сохранении в векторном формате, в данном случае PDF, размер сгенерированного файла масштабируется с количеством точек.

Поскольку у меня много точек с большим количеством перекрытийточки, я установил alpha=.2, чтобы увидеть, насколько плотно распределены точки.В центральных областях это приводит к отображению цвета, равного виду alpha=1.

. Есть ли способ «обрезать» эти области (например, путем объединения точек перекрытия на указанном расстоянии) при сохранении рисунка ввекторизованный файл, таким образом, вместо сохранения каждой отдельной точки сохраняется какая-то область?

Что я забыл упомянуть: так как мне нужно построить корреляцию нескольких переменных, мне нужна (nxn) матрица точечной диаграммыгде n - количество переменных.Это препятствует использованию hexbin или других методов, так как мне придется самостоятельно создавать полную сетку графиков.

Например, как в:

fig_sc = plt.figure(figsize=(5, 5))
ax_sc = fig_sc.gca()
ax_sc.scatter(
    np.random.normal(size=100000), 
    np.random.normal(size=100000), 
    s=10, marker='o', facecolors='none', edgecolors='black', alpha=.3)
fig_sc.savefig('test.pdf', format='pdf')

Это приводит кразмер файла примерно 1,5 МБ, поскольку каждая точка сохраняется.Можно ли как-то «уменьшить» это изображение, комбинируя перекрывающиеся точки?

Я пробовал несколько вариантов, таких как установка dpi=300 и transparence=False, но, поскольку PDF сохраняет фигуру как векторизованное изображение, это, естественно, неизменить что-либо.

Вещи, которые могут работать, но имеют недостатки:

  • Шестнадцатеричные графики: Работает для одного точечного графика, если разрешение и карта правильно настроены, но я хочу построитьматрица рассеяния с (nxn) точками рассеяния.Афаик отсутствует в матрице шестнадцатеричной матрицы.
  • сохранение в растеризованном формате: графики предназначены для журнала, который запрашивает векторизованные графики везде, где это возможно.Таким образом, я бы хотел избежать сохранения растрового изображения.
  • случайное извлечение частей данных: может работать, но изменит внешний вид графиков.

Любойидеи?
Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Может быть, вы захотите изменить свой подход и использовать что-то отличное от точечной диаграммы, оставив Numpy и Matplotlib задачу пониженной дискретизации вашего набора данных - другими словами, используйте Numpy's histogram2d и Matplotlib imshow

x, y = [p.random.normal(size=100000) for _ in (4, 34)]
h, xedge, yedge = np.histogram2d(x, y, bins=25)
cmap = plt.get_cmap('Greys')
plt.imshow(h, interpolation='lanczos', origin='low', cmap=cmap,
            extent=[xedge[0], xedge[-1], yedge[0], yedge[-1]])

enter image description here

plt.savefig('Figure1.pdf') # → 30384 bytes

Сетка (на этот раз с использованием hexbin)

np.random.seed(20190308)                                                         
fig, axes = plt.subplots(3, 2, figsize=(4,6), 
                         subplot_kw={'xticks': [], 'yticks': []}) 
fig.subplots_adjust(hspace=0.05, wspace=0.05)                                    

for ax in axes.flat: 
    ax.hexbin(*(np.random.normal(size=10000) for _ in ('x', 'y')), cmap=cmap) 

enter image description here

0 голосов
/ 08 марта 2019

Это может быть чит, но вы можете сохранить его как файл .png, а затем вставить его в холст pdf через латекс и подогнать поля документа к рисунку.

...