Как я могу построить точки, чтобы они появлялись поверх колючек с помощью matplotlib? - PullRequest
4 голосов
/ 10 сентября 2010

Следующее создает график с тремя точками данных, в (0, 0), (0, 0.5) и (1, 1).Видна только та часть нанесенных точек (маленьких кружков), которые лежат внутри области графика, поэтому я вижу четверть кругов в углах и полукруг вдоль левого корешка.

Есть ли уловка Iможно использовать, чтобы сделать все точки полностью видимыми, чтобы они не были обрезаны в кадре осей?

from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure

fig = Figure()
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111)
ax.plot([0, 0, 1], [0, 0.5, 1], 'o')
fig.canvas.print_figure('test.png')

Редактировать: Предложение Амро - очевидный подход - не является предпочтительнымподход, как это для ROC-графиков (условно рисуется с прямоугольником от 0 до 1 на обеих осях).Если бы я мог обмануть matplotlib, чтобы получить результаты, подобные многим в http://www.google.com/search?q=roc+plot, которые имеют прямоугольник около 0..1 по обеим осям, но имеют точки, нарисованные поверх линий осей, как это делают многие из них, этобыло бы оптимальным.

Редактировать 2: Я предполагаю, что это можно сделать, используя " размещение позвоночника " (новое по состоянию на 0,99 MPL), с площадью участканемного увеличенный, как предложил Амро, но затем с шипами немного переместившимися вдоль обеих нулевых осей.Я поэкспериментирую с этим и опубликую ответ, если он сработает, хотя не стесняйтесь побить меня этим.

Ответы [ 3 ]

7 голосов
/ 10 сентября 2010

Вы можете отключить отсечение либо в команде plot, либо в объектах Artist, возвращаемых вызовом «plot».

Во-первых, вот фигура с очень большими символами, поэтому все ясно:

alt text

В команде сюжета вы можете сделать

ax.plot([0, 0, 1], [0, 0.5, 1], 'o', clip_on=False, markersize=20)

или вы могли бы

p = ax.plot([0, 0, 1], [0, 0.5, 1], 'o', markersize=20)
for m in p:
    m.set_clip_on(False)
2 голосов
/ 10 сентября 2010

Вы можете немного расширить пределы осей во всех направлениях:

ax = fig.add_subplot(111, xlim=(-0.1,1.1), ylim=(-0.1,1.1))

alt text

1 голос
/ 10 сентября 2010

Я объединил свою идею, используя новую возможность spine.set_position () с предложением Амро немного расширить границы. Следующее работает только с matplotlib 1.0 или более поздней версии, поскольку оно опирается на новый вызов spine.set_bounds (). (Я думаю, что идея Амро тоже нуждалась в версии 1.0 или более поздней, поскольку xlim / ylim kwargs ничего не сделал для меня с 0.99.1.)

fig = Figure()
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111, xlim=(-0.1, 1.1), ylim=(-0.1, 1.1))
ax.plot([0, 0, 1], [0, 0.5, 1], 'o')
for side in 'left bottom top right'.split():
    ax.spines[side].set_position('zero')
    ax.spines[side].set_bounds(0, 1)
canvas.print_figure('test.png')

Мне все еще было бы интересно услышать, есть ли другой подход, но я думаю, что после долгих поисков в Google, у matplotlib есть основное ограничение вокруг этой области: все данные сильно ограничены областью, определенной для оси.

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