Matplotlib: правильно отрегулируйте пространство изображения для соответствия номерам [дублировать]

Перевертывание предложений limit и filter имеет разные типы поведения.

Если вы сначала поместите limit, поток сначала сгенерирует 10 целых чисел [1..10], а затем фильтруйте их, оставляя только те, которые меньше 5.

В исходном порядке, при первом применении filter, целые числа генерируются и фильтруются до тех пор, пока вы не достигнете 10 элементов. Это не бесконечный оператор, так как i в поставщике в конечном итоге переполняется, но для достижения MAX_INT потребуется некоторое время, особенно на медленном компьютере.

127
задан robintw 28 October 2010 в 11:57
поделиться

8 ответов

Один из способов автоматического выполнения этого - bbox_inches='tight' kwarg в plt.savefig .

Например

import matplotlib.pyplot as plt
import numpy as np
data = np.arange(3000).reshape((100,30))
plt.imshow(data)
plt.savefig('test.png', bbox_inches='tight')

Другой способ - использовать fig.tight_layout()

import matplotlib.pyplot as plt
import numpy as np

xs = np.linspace(0, 1, 20); ys = np.sin(xs)

fig = plt.figure()
axes = fig.add_subplot(1,1,1)
axes.plot(xs, ys)

# This should be called after all axes have been added
fig.tight_layout()
fig.savefig('test.png')
174
ответ дан detly 19 August 2018 в 09:13
поделиться
  • 1
    Есть ли способ сделать это по умолчанию? – endolith 8 July 2012 в 02:08
  • 2
    Если у вас есть несколько подзаговоров и вы хотите сохранить их, вы можете использовать это с помощью fig.savefig(). (plt.savefig() в этом случае не будет работать.) – Abhranil Das 21 April 2013 в 13:07
  • 3
    Все это делает обрезку изображения после его визуализации; если вы пытаетесь применить конкретное разрешение, изображение выйдет less . – detly 19 January 2015 в 12:23
  • 4
    @detly - Да. Это именно то, что он делает (хотя и может «вырезать» и «сделать», а также увеличить изображение). Для чего вы хотите, посмотрите fig.tight_layout(). Эта функция не существовала, когда этот ответ был первоначально написан, иначе я бы назвал его более заметным. – Joe Kington 19 January 2015 в 13:33
  • 5
    Если у кого-то проблема, используйте fig = plt.gcf() – KyungHoon Kim 24 February 2015 в 08:17

Вы можете отрегулировать интервал вокруг фигур matplotlib с помощью функции subplots_adjust ():

import matplotlib.pyplot as plt
plt.plot(whatever)
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)

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

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

100
ответ дан DaveP 19 August 2018 в 09:13
поделиться
  • 1
    Значения, назначенные параметрам, а не как их изменить, - это то, где нужно установить маржу. Другими словами, если вы хотите, чтобы маркер правого края был на 10%, вы должны установить значение справа = 0,9, а не правое = 0,1 matplotlib.sourceforge.net/api/… – drootang 18 November 2011 в 18:18
  • 2
    Имеет смысл указать, что, очевидно, вы можете указать отрицательные значения в plt.subplots_adjust (). Это позволяет даже рисовать за пределами области рисунка, а также иметь дело с раздражающими полями. – surchs 12 February 2014 в 17:02
  • 3
    Это также работает с объектами GridSpec, вызывая метод update (см. stackoverflow.com/a/20058199/1030876 ). – Aaron Voelker 19 February 2017 в 22:44
plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)
4
ответ дан Mark Hall 19 August 2018 в 09:13
поделиться
  • 1
    & Quot; pad_inches = -1 & Quot; потому что мой savefig производит только часть фигуры. – Yu Shen 14 July 2013 в 00:34
  • 2
    Использование параметра в функции savefig является элегантным, однако отрицательное значение для pad_inches необязательно необходимо в каждом случае. – MichaelHuelsen 26 July 2017 в 07:17
  • 3
    установить его на 0, помогает – Joop 8 March 2018 в 13:25

Просто используйте «ax = fig.add_axes ([left, bottom, width, height])», если вы хотите точно контролировать макет фигуры. например

    left = 0.05
    bottom = 0.05
    width = 0.9
    height = 0.9
    ax = fig.add_axes([left, bottom, width, height])
5
ответ дан mason 19 August 2018 в 09:13
поделиться

, вдохновленный Sammys, ответом выше:

margins = {  #     vvv margin in inches
    "left"   :     1.5 / figsize[0],
    "bottom" :     0.8 / figsize[1],
    "right"  : 1 - 0.3 / figsize[0],
    "top"    : 1 - 1   / figsize[1]
}
fig.subplots_adjust(**margins)

Если figsize - это кортеж, который вы использовали в fig = pyplot.figure(figsize=...)

2
ответ дан michaelosthege 19 August 2018 в 09:13
поделиться

Для меня ответы выше не работали с matplotlib.__version__ = 1.4.3 на Win7. Итак, если нас интересует только сам образ (т. Е. Если нам не нужны аннотации, оси, тики, заголовок, ярлык и т. Д.), Тогда лучше просто сохранить массив numpy как изображение вместо savefig.

from pylab import *

ax = subplot(111)
ax.imshow(some_image_numpyarray)
imsave('test.tif', some_image_numpyarray)

# or, if the image came from tiff or png etc
RGBbuffer = ax.get_images()[0].get_array()
imsave('test.tif', RGBbuffer)

Кроме того, используя opencv функции рисования (cv2.line, cv2.polylines), мы можем сделать некоторые чертежи непосредственно в массиве numpy. http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html

1
ответ дан otterb 19 August 2018 в 09:13
поделиться

Проблема с matplotlibs subplots_adjust заключается в том, что введенные вами значения относятся к размеру x и y фигуры. В этом примере приведены правильные значения для печати pdf:

. Для этого я пересчитываю относительное расстояние до абсолютных значений следующим образом:

pyplot.subplots_adjust(left = (5/25.4)/figure.xsize, bottom = (4/25.4)/figure.ysize, right = 1 - (1/25.4)/figure.xsize, top = 1 - (3/25.4)/figure.ysize)

для фигуры фигуры. xsize 'дюймы в x-размерном и дюймах' figure.ysize 'в y-размерности. Таким образом, весь рисунок имеет левый край 5 мм, нижний край 4 мм, правый 1 мм и верх 3 мм внутри этикеток. Преобразование (x / 25.4) выполняется, потому что мне нужно было преобразовать мм в дюймы.

Обратите внимание, что чистый размер диаграммы x будет «figure.xsize - левое поле - правое поле» и чистый размер диаграммы y будет «figure.ysize - нижнее поле - верхняя граница» в дюймах

Другие sniplets (не уверены в этих, я просто хотел предоставить другие параметры)

pyplot.figure(figsize = figureSize, dpi = None)

и

pyplot.savefig("outputname.eps", dpi = 100)
3
ответ дан Sammy 19 August 2018 в 09:13
поделиться

Все, что вам нужно, это

plt.tight_layout()

перед вашим выходом.

В дополнение к сокращению полей, это также плотно группирует пространство между любыми поднаборами:

x = [1,2,3]
y = [1,4,9]
import matplotlib.pyplot as plt
fig = plt.figure()
subplot1 = fig.add_subplot(121)
subplot1.plot(x,y)
subplot2 = fig.add_subplot(122)
subplot2.plot(y,x)
fig.tight_layout()
plt.show()
38
ответ дан user2065406 19 August 2018 в 09:13
поделиться
  • 1
    Я думаю, что это действительно лучший метод. Это не требует сохранения фигуры типа `bbox = 'tight' и исправляет всевозможные другие проблемы с макетом в стесненных фигурах. – dshepherd 1 May 2013 в 00:59
  • 2
    это должен быть правильный ответ, потому что он ведет себя так, как вы ожидали, поскольку это относится к РИСУНОК вместо изображения. – Majid alDosari 12 November 2015 в 19:47
Другие вопросы по тегам:

Похожие вопросы: