python - شرح - مؤامرات Matplotlib: إزالة المحور والأساطير والمساحات البيضاء




seaborn (5)

أعتقد أن axis('off') القيادة axis('off') يعتني بأحد المشاكل بشكل أكثر إيجازًا من تغيير كل محور والحدود بشكل منفصل. لا يزال يترك مساحة بيضاء حول الحدود ومع ذلك. إضافة bbox_inches='tight' إلى الأمر savefig يكاد يصل إلى هناك ، يمكنك أن ترى في المثال أدناه أن المسافة البيضاء المتبقية أصغر بكثير ، ولكنها لا تزال موجودة.

from numpy import random
import matplotlib.pyplot as plt

data = random.random((5,5))
img = plt.imshow(data, interpolation='nearest')
img.set_cmap('hot')
plt.axis('off')
plt.savefig("test.png", bbox_inches='tight')

أنا جديد في Python و Matplotlib ، أود ببساطة تطبيق colormap على صورة وكتابة الصورة الناتجة ، دون استخدام المحاور أو التسميات أو العناوين أو أي شيء عادةً ما تتم إضافته تلقائيًا بواسطة matplotlib. هذا ما فعلته:

def make_image(inputname,outputname):
    data = mpimg.imread(inputname)[:,:,0]
    fig = plt.imshow(data)
    fig.set_cmap('hot')
    fig.axes.get_xaxis().set_visible(False)
    fig.axes.get_yaxis().set_visible(False)
    plt.savefig(outputname)

يزيل بنجاح محور الشكل ، ولكن الرقم المحفوظة يعرض حشوة بيضاء وإطار حول الصورة الفعلية. كيف يمكنني إزالتها (على الأقل الحشو الأبيض)؟ شكر


أعجبتني إجابة ، لكنها لم تظهر بوضوح كيفية ضبط حجم الصور غير المربعة خارج الصندوق ، لذا قمت بتعديلها لسهولة نسخها ولصقها:

import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

def save_image_fix_dpi(data, dpi=100):
    shape=np.shape(data)[0:2][::-1]
    size = [float(i)/dpi for i in shape]

    fig = plt.figure()
    fig.set_size_inches(size)
    ax = plt.Axes(fig,[0,0,1,1])
    ax.set_axis_off()
    fig.add_axes(ax)
    ax.imshow(data)
    fig.savefig('out.png', dpi=dpi)
    plt.show()

يعد حفظ الصور بدون حدود أمرًا سهلاً مهما كانت نقطة في البوصة التي تختارها إذا كانت pixel_size / dpi = يتم الاحتفاظ بالحجم.

data = mpimg.imread('test.png')
save_image_fix_dpi(data, dpi=100)

لكن العرض هو عصبي. إذا اخترت نقطة في البوصة الصغيرة ، يمكن أن يكون حجم الصورة أكبر من الشاشة وتحصل على الحدود أثناء العرض. ومع ذلك ، هذا لا يؤثر على الادخار.

وذلك ل

save_image_fix_dpi(data, dpi=20)

تتحول الشاشة إلى حدود (لكنها تحفظ الأعمال):


تعلمت هذه الحيلة من هنا ، هنا :

import matplotlib.pyplot as plt
import numpy as np

def make_image(data, outputname, size=(1, 1), dpi=80):
    fig = plt.figure()
    fig.set_size_inches(size)
    ax = plt.Axes(fig, [0., 0., 1., 1.])
    ax.set_axis_off()
    fig.add_axes(ax)
    plt.set_cmap('hot')
    ax.imshow(data, aspect='equal')
    plt.savefig(outputname, dpi=dpi)

# data = mpimg.imread(inputname)[:,:,0]
data = np.arange(1,10).reshape((3, 3))

make_image(data, '/tmp/out.png')

عائدات


لم يذكر أي شخص imsave بعد ، مما يجعل هذا واحد من الخطوط الملاحية المنتظمة:

import matplotlib.pyplot as plt
import numpy as np

data = np.arange(10000).reshape((100, 100))
plt.imsave("/tmp/foo.png", data, format="png", cmap="hot")

انها تخزن الصورة مباشرة كما هي ، أي لا تضيف أي محاور أو حدود / حشو.


يمكنك أيضًا تحديد مدى الرقم إلى الوسيطة bbox_inches . هذا من شأنه التخلص من الحشو الأبيض حول الشكل.

def make_image(inputname,outputname):
    data = mpimg.imread(inputname)[:,:,0]
    fig = plt.imshow(data)
    fig.set_cmap('hot')
    ax = fig.gca()
    ax.set_axis_off()
    ax.autoscale(False)
    extent = ax.get_window_extent().transformed(plt.gcf().dpi_scale_trans.inverted())
    plt.savefig(outputname, bbox_inches=extent)




matplotlib