ax.set_aspect('equal')
一切正常。当然,如果只执行此操作,则记号标签的范围仅为0到1,因此必须应用一点matplotlib魔术将记号标签调整为原始数据范围。答案
here
显示了如何使用
FuncFormatter
. 但是,由于原始记号是相对于间隔[0,1]选择的,因此使用
函数格式化程序
AutoLocator
tick_values()
作用然后,这些刻度可以再次缩放到间隔[0,1],然后
函数格式化程序
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
from mpl_toolkits.axes_grid1 import make_axes_locatable
x = np.random.normal(512, 112, 240)
y = np.random.normal(0.5, 0.1, 240)
fig,ax=plt.subplots()
divider = make_axes_locatable(ax)
##increased pad from 0.1 to 0.2 so that tick labels don't overlap
xhax = divider.append_axes("top", size=1, pad=0.2, sharex=ax)
yhax = divider.append_axes("right", size=1, pad=0.2, sharey=ax)
##'normalizing' x and y values to be between 0 and 1:
xn = (x-min(x))/(max(x)-min(x))
yn = (y-min(y))/(max(y)-min(y))
##producinc the plots
ax.scatter(xn, yn)
xhax.hist(xn)
yhax.hist(yn, orientation="horizontal")
##turning off duplicate ticks (if needed):
plt.setp(xhax.get_xticklabels(), visible=False)
plt.setp(yhax.get_yticklabels(), visible=False)
ax.set_aspect('equal')
##setting up ticks and labels to simulate real data:
locator = mticker.AutoLocator()
xticks = (locator.tick_values(min(x),max(x))-min(x))/(max(x)-min(x))
ax.set_xticks(xticks)
ax.xaxis.set_major_formatter(mticker.FuncFormatter(
lambda t, pos: '{0:g}'.format(t*(max(x)-min(x))+min(x))
))
yticks = (locator.tick_values(min(y),max(y))-min(y))/(max(y)-min(y))
ax.set_yticks(yticks)
ax.yaxis.set_major_formatter(mticker.FuncFormatter(
lambda t, pos: '{0:g}'.format(t*(max(y)-min(y))+min(y))
))
fig.tight_layout()
plt.show()
生成的图片看起来与预期的一样,并且在调整图像大小时也保持方形。
:
这与其说是解决方案,不如说是一种变通方法:
而不是使用
ax.set_aspect()
figsize=(n,n)
到
plt.subplots
哪里
n
xhax
以及
yhax
都是1英寸,这意味着
ax
也变成正方形。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
x = np.random.normal(512, 112, 240)
y = np.random.normal(0.5, 0.1, 240)
fig, ax = plt.subplots(figsize=(5,5))
divider = make_axes_locatable(ax)
xhax = divider.append_axes("top", size=1, pad=0.1, sharex=ax)
yhax = divider.append_axes("right", size=1, pad=0.1, sharey=ax)
ax.scatter(x, y)
xhax.hist(x)
yhax.hist(y, orientation="horizontal")
##turning off duplicate ticks:
plt.setp(xhax.get_xticklabels(), visible=False)
plt.setp(yhax.get_yticklabels(), visible=False)
plt.show()
当然,一旦你调整你的身材,正方形的外观就会消失。但是,如果你已经知道你的身材的最终尺寸,并且只想保存它以供进一步使用,那么这应该是一个足够好的快速修复方法。