簡體   English   中英

縮放圖形而不縮放標簽,文本和軸刻度等

[英]Scaling graphic without scaling labels, text and axis ticks etc

我的圖形縮放有問題。 我使用imshow繪制兩個矩陣,第一個是2x2矩陣,第二個是5x5矩陣。 現在,我要使兩個具有相同大小的表示矩陣項的框相同。 但我希望它們的絕對大小相同(例如像素)。 如果我同時繪制兩個圖並進行比較,則2x2矩陣框相對於內部數字要比5x5矩陣大得多。 2x2矩陣,太大的盒子 5x5矩陣,正確的盒子大小我嘗試使用plt.figure()函數的“ figsize”參數,但這也會重新縮放盒子中的數字。 我嘗試過的另一件事是imshow的“ extent”參數,如果我只是想使盒子變小,則該參數不起作用。 它只是擴大了他們的規模。 (如果我使邊界框變寬,它會起作用,然后它會自動使它們變薄,但這不是我想要的,下面的示例)。 使用范圍:更寬更薄,但我不知道

現在再說一遍:我有點想調整框的大小,但不要更改文本/數字的大小,這樣如果我在文章中將圖形緊挨着放置,它看起來就不會轉儲。 它不一定是自動匹配兩個圖形框大小的一種方法,我已經對任何調整框大小的方法都感到滿意,因為它不必是100%准確的。 有人知道我該怎么做嗎? 非常感謝!

這是兩個帶有方形框的圖形的代碼(我想要的,但是只是更改了大小):

import matplotlib.pyplot as plt
import numpy as np
plt.style.use("seaborn-dark")

def gfx_1():
    fig = plt.figure()
    ax1 = plt.subplot(111)
    data = [[1, 2], [3, 4]]
    ax1.imshow(data, interpolation="nearest")
    for (i, j), data in np.ndenumerate(data):
        ax1.text(i, j, s=str(data), ha='center', va='center')

    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks(np.arange(-0.5, 1.5, 1.))
    ax1.set_yticks(np.arange(-0.5, 1.5, 1.))
    ax1.grid(linewidth=2)

    plt.savefig("2x2.png")


def gfx_2():
    fig = plt.figure()
    ax1 = plt.subplot(111)
    data = [[1, 2, 3, 4, 5], [3, 4, 5, 6, 7], [6, 7, 8, 9, 10], [9, 10, 11, 12, 13], [12, 13, 14, 15, 16]]
    ax1.imshow(data, interpolation="nearest")
    for (i, j), data in np.ndenumerate(data):
        ax1.text(i, j, s=str(data), ha='center', va='center')

    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks(np.arange(-0.5, 4.5, 1.))
    ax1.set_yticks(np.arange(-0.5, 4.5, 1.))
    ax1.grid(linewidth=2)

    plt.savefig("5x5.png")

和具有擴展的修改之一(我不知道):

def gfx_1():
    fig = plt.figure()
    ax1 = plt.subplot(111)
    data = [[1, 2], [3, 4]]
    ax1.imshow(data, interpolation="nearest", extent=(-0.5, 3.5, -0.5, 1.5))
    for (i, j), data in np.ndenumerate(data):
        ax1.text(i*2, j, s=str(data), ha='center', va='center')

    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks(np.arange(-0.5, 3.5, 2.))
    ax1.set_yticks(np.arange(-0.5, 1.5, 1.))
    ax1.grid(linewidth=2)

    plt.savefig("2x2_wide.png")

我認為您已經使用figsize找到了正確的答案。 當然,使用2x2網格時,生成的圖像可能看起來更大,但這可能只是圖像可視化程序中縮放的問題。 如果要以其原始分辨率並排顯示它們,則正方形的大小將相同。

換句話說,如果您在2英寸x 2英寸的圖像中創建2x2網格,則每個框的寬度都將小於1英寸(由於軸和其他所有元素)。 如果您在5x5英寸的圖像中創建5x5網格,則框的寬度仍約為1英寸

使用以下代碼創建了兩個圖像,並在圖像編輯器中並排復制粘貼了它們: 在此處輸入圖片說明

def gfx_1():
    fig = plt.figure(figsize=(2,2))
    ax1 = plt.subplot(111)
    data = [[1, 2], [3, 4]]
    ax1.imshow(data, interpolation="nearest")
    for (i, j), data in np.ndenumerate(data):
        ax1.text(i, j, s=str(data), ha='center', va='center')

    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks(np.arange(-0.5, 1.5, 1.))
    ax1.set_yticks(np.arange(-0.5, 1.5, 1.))
    ax1.grid(linewidth=2)

    plt.savefig("./2x2.png")


def gfx_2():
    fig = plt.figure(figsize=(5,5))
    ax1 = plt.subplot(111)
    data = [[1, 2, 3, 4, 5], [3, 4, 5, 6, 7], [6, 7, 8, 9, 10], [9, 10, 11, 12, 13], [12, 13, 14, 15, 16]]
    ax1.imshow(data, interpolation="nearest")
    for (i, j), data in np.ndenumerate(data):
        ax1.text(i, j, s=str(data), ha='center', va='center')

    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_xticks(np.arange(-0.5, 4.5, 1.))
    ax1.set_yticks(np.arange(-0.5, 4.5, 1.))
    ax1.grid(linewidth=2)

    plt.savefig("./5x5.png")

gfx_1()
gfx_2()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM