Окраска близких точек - PullRequest
4 голосов
/ 05 июня 2010

У меня плотный набор точек на плоскости.Я хочу, чтобы они были цветными, чтобы точки, расположенные близко друг к другу, имели одинаковый цвет и другой цвет, если они далеко.Для простоты предположим, что есть, скажем, 5 разных цветов на выбор.Оказывается, я не имею ни малейшего понятия, как это сделать ..

Я использую Tkinter с Python, кстати

Ответы [ 4 ]

2 голосов
/ 05 июня 2010

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

Вы можете использовать что-то вроде

point.color(R,G,B) = ( point.normalized_x, 0.5, 1-point.normalized.y )

, где normalized_x - это (x-min_x / (max_x-min_x)), так что это даст 0 для точки с минимальным значением x и 1 для точки с максимальным значением x.

Если вам действительно нужно использовать только небольшое количество цветов и у точки закрытия есть точный того же цвета , то вам придется выполнить некоторую кластеризацию в ваших данных ( K-означает , являющийся простым и широко используемым алгоритмом). После кластеризации вы просто назначаете каждой точке цвет в соответствии с идентификатором ее кластера. У Python есть несколько хороших реализаций, включая кластеризацию scipy .

0 голосов
/ 05 июня 2010

Проблемной областью является тщательный кластерный анализ , и Cluster suite с PyCluster - хорошее начало.

0 голосов
/ 05 июня 2010

Один из подходов состоит в том, чтобы пройти через ваши точки и разбить их на наборы с «центром». Так как у вас есть 5 цветов, у вас будет 5 комплектов. Вы сравниваете расстояние новой точки от каждого из центров и затем помещаете ее в ту же группу, что и ближайшая.

Каждый набор соответствует своему цвету, так что вы можете просто нанести его на график после того, как это разбиение выполнено.

0 голосов
/ 05 июня 2010

Я бы начал с определения концентрации пятен на плоскости. Найдите центры этих агломераций и назначьте им каждый уникальный цвет. Тогда для других мест вы можете просто рассчитать цвет по линейному принципу. Например, если один центр красный, а другой желтый, точка где-то посередине станет оранжевой.

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

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