matplotlib: границы осей и расположение меток / меток - PullRequest
0 голосов
/ 20 декабря 2018

Конечный результат, которого я пытаюсь достичь, - это иметь "более толстую" черную границу вокруг моего графика вдоль xmin, xmax, ymin и & max.Я пробовал несколько разных вещей (например, просто нарисовал прямоугольник на графике, см. Ниже), но я не смог достичь желаемых результатов по нескольким причинам.

Потому что я не могу простоиспользуйте колючки (я установил 2 из них, чтобы всегда быть в 0), мне нужно добавить какую-то другую линию или прямоугольник, чтобы создать желаемую границу.

По умолчанию метки первого и последнего тика нависают над осями,Я «преодолел» это, изменив горизонтальное или вертикальное выравнивание, но они все еще могли бы использовать некоторые дополнительные отступы.Я знаю, что это возможно, но требует преобразования и немного неуклюже.

Теперь я хотел бы удалить первую и последнюю отметки на обеих осях.Это связано с тем, что при рисовании прямоугольника он всегда находится внутри области графика, но первый и последний отметки всегда находятся вне его, независимо от толщины прямоугольника.Увеличение толщины прямоугольника приводит только к тому, что он перекрывает первую и последнюю метку тика, а фактическая метка остается за пределами прямоугольника.

Любые другие предложения о том, как добиться такого рода границы, при этом всегда сохраняя ось на0, 0 будет приветствоваться.Это общий желаемый результат.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.patches import Rectangle

X = np.random.randint(low=-9, high=9, size=10)
Y = np.random.randint(low=-9, high=9, size=10)

fig, ax = plt.subplots()
ax.axis([-10, 10, -10, 10])
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.setp(ax.xaxis.get_majorticklabels()[0], ha='left')
plt.setp(ax.xaxis.get_majorticklabels()[-1], ha='right')
plt.setp(ax.yaxis.get_majorticklabels()[0], va='bottom')
plt.setp(ax.yaxis.get_majorticklabels()[-1], va='top')
patPlotBorder = ax.add_artist(Rectangle((-10, -10), 20, 20, fill=False, color='k', linewidth=2))
ax.grid(True)
fig.set_tight_layout(True)
ax.scatter(X, Y, c="b", marker="o", s=40)
plt.show()

Scatter with Axis at 0, 0 and Border

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Не изменяя большую часть своего кода, вы можете установить clip_on на False, чтобы отображался полный прямоугольник.

border = Rectangle((-10, -10), 20, 20, fill=False, color='k', linewidth=3, clip_on=False)
ax.add_artist(border)

enter image description here

Поскольку линии сетки отображаются над содержимым осей, у вас есть серая линия внутри границы прямоугольника.


Кроме того, вы можете использовать две оси.Один со всем содержимым, измененными позициями позвоночника и т. Д., А другой - с выделением жирных позвонков и удалением всех остальных.

import numpy as np
import matplotlib.pyplot as plt

X = np.random.randint(low=-9, high=9, size=10)
Y = np.random.randint(low=-9, high=9, size=10)

fig, ax = plt.subplots()
ax2 = fig.add_subplot(111)
ax2.patch.set_visible(False)
ax2.tick_params(left=False, bottom=False, labelleft=False, labelbottom=False)
for _, sp in ax2.spines.items():
    sp.set_linewidth(3)

ax.axis([-10, 10, -10, 10])
ax.spines['left'].set_position('zero')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.setp(ax.xaxis.get_majorticklabels()[0], ha='left')
plt.setp(ax.xaxis.get_majorticklabels()[-1], ha='right')
plt.setp(ax.yaxis.get_majorticklabels()[0], va='bottom')
plt.setp(ax.yaxis.get_majorticklabels()[-1], va='top')

ax.grid(True)
fig.set_tight_layout(True)
ax.scatter(X, Y, c="b", marker="o", s=40)
plt.show()

enter image description here

0 голосов
/ 20 декабря 2018

Вы можете получить доступ к отдельным линиям сетки, позвонив по номеру get_{x|y}gridlines().Каждая линия сетки является объектом типа Line2D, и вы можете изменять любые их свойства, , такие как толщина, цвет и т. Д. .

ax.get_xgridlines()[0].set_linewidth(5)
ax.get_xgridlines()[-1].set_linewidth(5)
ax.get_ygridlines()[0].set_linewidth(5)
ax.get_ygridlines()[-1].set_linewidth(5)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...