Это может быть не совсем то, что вы ищете, но вы можете применить фильтрацию на этапе построения графика, отфильтровав отфильтрованные данные, но оставив исходные данные без изменений и не делая лишних копий. Затем вы можете получить автоматически масштабируемые пределы x и y, прежде чем наносить на график выбросы, после чего вы возвращаете пределы x и y к их значениям до выброса. Он не должен быть значительно более неэффективным, чем отдельный сюжет. Примерно так
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,10,25)
y = np.sin(x)
y[-1] = -200
cond = y > -25
plt.scatter(x[cond],y[cond])
xlim = plt.xlim()
ylim = plt.ylim()
plt.scatter(x[cond == False], y[cond == False])
plt.xlim(xlim)
plt.ylim(ylim)
plt.show()
Без фильтрации это показывает
, а с фильтрацией показывает
но при уменьшении выброс снова виден. Я уверен, что здесь есть более элегантное решение, но этого может быть достаточно для ваших целей.
Редактировать
Чтобы сделать это менее громоздким, его можно обернуть в удобную функцию следующим образом
import matplotlib.pyplot as plt
import numpy as np
def scaledScatter(x, y, cond, **kwargs):
plt.scatter(x[cond],y[cond], **kwargs)
xlim = plt.xlim()
ylim = plt.ylim()
plt.scatter(x[cond == False], y[cond == False], **kwargs)
plt.xlim(xlim)
plt.ylim(ylim)
x = np.linspace(0,10,25)
y = np.sin(x)
y[-1] = -200
cond = y > -25
scaledScatter(x, y, cond, color = 'k', marker = '.')
plt.show()
Обратите внимание, что эта формулировка позволяет передавать обычные ключевые аргументы для matplotlib.pyplot.scatter
и распространяет их соответствующим образом.