Ограничьте точки в подсюжетах только увеличенным в регионе - PullRequest
0 голосов
/ 02 мая 2019

У меня есть набор из 100 случайных двумерных точек (от 0 до 20) на точечной диаграмме с двумя вспомогательными участками, окружающими основную. Когда я увеличиваю основную диаграмму рассеяния, диапазон на вспомогательных участках сокращается, однако я вижу точки за пределами области окна увеличения.

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

import random

numPoints = 100
x = [random.uniform(0, 20) for i in range(numPoints)]
y = [random.uniform(0, 20) for i in range(numPoints)]

# Set up the axes with gridspec
fig = plt.figure(figsize=(6, 6), constrained_layout=True)

grid = fig.add_gridspec(ncols=2, nrows=2, width_ratios=[0.3, 5], height_ratios=[5, 0.3])

main_ax = fig.add_subplot(grid[:-1, 1:])
main_ax.plot(x, y, 'ok', markersize=3, alpha=0.2)

y_hist = fig.add_subplot(grid[:-1, 0], xticklabels=[], sharey=main_ax)
x_hist = fig.add_subplot(grid[-1, 1:], yticklabels=[], sharex=main_ax)

x_hist.plot(
    x, [0 for i in x], 
    'ok',
    color='gray'
)
x_hist.invert_yaxis()

y_hist.plot(
    [0 for i in y], y,
    'ok',
    color='gray'
)
y_hist.invert_xaxis()

main_ax.grid(True, lw = 1, ls = '--', c = '.75')
x_hist.grid(True, axis="x", lw = 1, ls = '--', c = '.75')
y_hist.grid(True, axis="y", lw = 1, ls = '--', c = '.75')

plt.show()

image

Я пытаюсь получить точки на левом и нижнем вспомогательных участках вышеупомянутого изображения, чтобы они совпадали с тем, что вы видите на основном графике (3 балла).

Вместо этого они показывают все в этом направлении. Левый подпункт показывает каждую точку на оси х в диапазоне от 0 до 2,5. Нижний участок показывает каждую точку на оси у между 10 и 12,5.

1 Ответ

0 голосов
/ 02 мая 2019

Вам потребуется отфильтровать данные, в зависимости от пределов главных осей. Можно подключить обратные вызовы для событий масштабирования, см. Matplotlib: Определение xlim и ylim после масштабирования и подключить их к функции, которая выполняет фильтрацию данных.

import numpy as np
import matplotlib.pyplot as plt


numPoints = 100
x = np.random.rand(numPoints)*20
y = np.random.rand(numPoints)*20

zeros = np.zeros_like(x)

# Set up the axes with gridspec
fig = plt.figure(figsize=(6, 6), constrained_layout=True)
grid = fig.add_gridspec(ncols=2, nrows=2, width_ratios=[0.3, 5], height_ratios=[5, 0.3])

ax_main = fig.add_subplot(grid[:-1, 1:])
ax_y = fig.add_subplot(grid[:-1, 0], xticklabels=[], sharey=ax_main)
ax_x = fig.add_subplot(grid[-1, 1:], yticklabels=[], sharex=ax_main)

ax_main.plot(x, y, 'ok', markersize=3, alpha=0.2)
xline, = ax_x.plot(x, zeros, marker='o', ls="none", color='gray')
yline, = ax_y.plot(zeros, y, marker='o', ls="none", color='gray')

ax_main.grid(True, lw = 1, ls = '--', c = '.75')
ax_y.grid(True, axis="x", lw = 1, ls = '--', c = '.75')
ax_x.grid(True, axis="y", lw = 1, ls = '--', c = '.75')


def xchange(evt):
    ymin, ymax = ax_main.get_ylim()
    filt = (y <= ymax) & (y >= ymin)
    xline.set_data(x[filt], zeros[filt])

def ychange(evt):
    xmin, xmax = ax_main.get_xlim()
    filt = (x <= xmax) & (x >= xmin)
    yline.set_data(zeros[filt], y[filt])

ax_main.callbacks.connect('xlim_changed', ychange)
ax_main.callbacks.connect('ylim_changed', xchange)

plt.show()

enter image description here

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