Как указать поле в мм / см с помощью matplotlib? - PullRequest
4 голосов
/ 04 ноября 2011

Пример

Предположим, у меня есть два треугольника:

  • Треугольник с точками (0, 0), (10, 0), (10, 0.5) и
  • треугольник с точками (0, 0), (1, 0), (0,5, 11)

Результирующие два графика без указания xlim и ylim выглядят так: enter image description here

Вопрос

Что мне нужно сделать, чтобы удовлетворить все пунктов, перечисленных ниже?

  • Сделать треугольник видимым, чтобы никакая линия треугольника не была скрыта осью
  • Укажите одинаковое поле для всех графиков в мм, см или других единицах.
    (в приведенном выше примере использовались только два треугольника. На самом деле у меня есть n треугольников.)
    Под полем я подразумеваю расстояние между внешними точками треугольника и осью.

Полученные графики должны выглядеть следующим образом enter image description here с той разницей, что расстояния, отмеченные красными стрелками, должны все быть одинаковыми!

Ответы [ 2 ]

0 голосов
/ 28 октября 2014

Ваши два треугольника с точками (0, 0), (10, 0), (10, 0.5) и (0, 0), (1, 0), (0.5, 11) будут представлены в pylab как:

Ax = [0, 10, 10]
Ay = [0, 0, 0.5]
Bx = [0, 1, 0.5]
By = [0, 0, 11]

pylab.plot(Ax, Ay)
pylab.plot(Bx, By)

Давайте посмотрим, что является самым низким значением X:

lowestX = None

for x in Ax+Bx:
    if lowestX==None or x<lowestX:
        lowestX = x

Упражнение для читателя, чтобы сделать то же самое для highestX, lowestY и highestY.

Теперь рассмотрим границу из 2 единиц, вы можете добавить / вычесть эти единицы из самых низких и самых высоких значений и установить xlim и ylim:

margin = 2

pylab.xlim([lowestX-margin, highestX+margin])
pylab.ylim([lowestY-margin, highestY+margin])
0 голосов
/ 20 ноября 2011

Я не знаю пути к нему в см / мм, но вы можете сделать это с преимущественным отношением к общему размеру:

# you don't really need this see bellow
#from matplotlib.backends.backend_pdf import PdfPages
import pylab
import matplotlib.pyplot as plt

left,bottom,width,height = 0.2,0.1,0.6,0.6 # margins as % of canvas size 

fig = plt.figure(figsize=(4,4),facecolor="yellow") # figure size in Inches
fig.patch.set_alpha(0.8) # just a trick so you can see the difference 
                         # between the "canvas" and the axes
ax1 = plt.Axes(fig,[left,bottom,width,height])
ax1.plot([1,2,3,4],'b') # plot on the first axes you created
fig.add_axes(ax1)

ax1.plot([0,1,1,0,0], [0,0,1,1,0],"ro") # plot on the first axes you created
ax1.set_xlim([-1.1,2]) 
ax1.set_ylim([-1.1,2]) 

# pylab.plot([0,1,1,0,0], [0,0,1,1,0],"ro") avoid usig if you 
# want to control more frames in a plot
# see my answer here
#http://stackoverflow.com/questions/8176458/\
#remove-top-and-right-axis-in-matplotlib-after-\
#increasing-margins/8180844#8180844

# pdf = PdfPages("Test.pdf")# you don't really need this
# pylab.savefig(pdf, papertype = "a4", format = "pdf")
# automagically make your pdf like this
pylab.savefig("Test1.pdf", papertype="a4",facecolor='y')  
pylab.show()
pylab.close()       
# pdf.close()

, и вы получите:

image with margins

corrected image

исправленное изображение:

...