Как расширить пределы равноаспектных данных только в одном направлении?Python

Программы на Python
Ответить
Anonymous
 Как расширить пределы равноаспектных данных только в одном направлении?

Сообщение Anonymous »

Я пытался установить равные пропорции данных в matplotlib с помощью ax.set_aspect('equal', 'datalim') (он же ax.axis('equal')), сохраняя при этом нижние границы/пределы, то есть привязывая одну сторону данных и расширяя пределы данных только на другой стороне.
В моем случае данные всегда положительны, поэтому я хотел бы расширить только верхняя/правая сторона. По умолчанию set_aspect всегда симметрично расширяет больший предел данных, центрируя данные на графике. set_aspect имеет параметр привязки, который, как я ожидаю, будет делать именно то, что я надеюсь, даже без ручной установки осей, путем привязки к SW. Хотя это прекрасно работает с set_aspect(adjustable='box'), это не имеет никакого эффекта с set_aspect(adjustable='datalim').
Вот простой пример того, чего я хотел бы, что я пробовал и что не сработало: (используя неквадратные графики, чтобы сделать разницу более ясной)

Код: Выделить всё

fig, axs = plt.subplots(2, 3, figsize = (3*6, 2*4))

# A correlation we want to realise is not exactly y=x by setting aspect
x = np.linspace(0, 10, 100)
y = 0.7*x+0.1*x*np.random.normal(size=100)

# Plot data and add y=x line for perspective
for ax in axs.ravel():
ax.scatter(x, y)
ax.axline((0, 0), (1, 1), color = 'gray', linestyle = '--')

axs[0, 0].set_title("Auto-scaled limits")

axs[0, 1].set_aspect('equal', 'datalim', anchor='SW')
axs[0, 1].set_title("Equal aspect, anchor='SW'\nanchor ignored, data centered")

axs[0, 2].set_aspect('equal', 'box', anchor='SW')
axs[0, 2].set_title("Equal aspect, anchor='SW', adjust='box'\nGoal achieved: x-axis starting at 0, but box shrunk")

axs[1, 0].set_aspect('equal', 'datalim', anchor='SW')
axs[1, 0].set_xlim(0, None)
axs[1, 0].set_title("Equal aspect, anchor='SW', set_xlim=(0, None) after aspect\nAnchor & xlim ignored, data centered")

axs[1, 1].set_xlim(0, None)
axs[1, 1].set_aspect('equal', 'datalim', anchor='SW')
axs[1, 1].set_title("set_xlim=(0, None) before aspect, equal aspect, anchor='SW'\nAnchor & xlim ignored, data centered")

equal_ax_width = 15.972217534050177 # X axis width after adjusting aspects
axs[1, 2].set_xlim(0-(equal_ax_width*0.05), equal_ax_width*1.05)
axs[1, 2].set_ylim(0-(max(y)*0.05), max(y)*1.05)
axs[1, 2].set_title("Manual adjustment - approximate goal")

fig.tight_layout()
Вот результаты:
Изображение

Я весь день копался в Stack Overflow, но ничего не появилось.>

Подробнее здесь: https://stackoverflow.com/questions/798 ... ction-only
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»