(Простой?) Размещение маркировки для линейных графиков

Если вы не заботитесь о порядке:

> from itertools import groupby
> batch_no = 3
> data = 'abcdefgh'

> [
    [x[1] for x in x[1]] 
    for x in 
    groupby(
      sorted(
        (x[0] % batch_no, x[1]) 
        for x in 
        enumerate(data)
      ),
      key=lambda x: x[0]
    )
  ]

[['a', 'd', 'g'], ['b', 'e', 'h'], ['c', 'f']]

Это решение не генерирует наборы одинакового размера, но распределяет значения таким образом, чтобы пакеты были как можно большими при сохранении количества сгенерированных пакетов. .

5
задан Doug McClean 23 June 2009 в 00:01
поделиться

3 ответа

Вот мой вариант:

  1. Отметьте точки, где вы хотите разместить метки
  2. Разделите их на группы с расстоянием не менее 2 * size между ними
  3. Для каждой группы пройдите справа и попробуйте поставить ярлык.
  4. Попробуйте поставить метку справа или слева. Посмотрите, что приведет к уменьшению длины вертикальной линии
  5. Если не имеет значения, попробуйте переместить вправо
  6. Если это не конец группы, попробуйте переместить ее влево

Теперь идите снова над этикетками и посмотрите, можно ли их перевернуть с одной стороны на другую, укорачивая при этом длину вертикальных линий.

По моему мнению, это должно привести к хорошему результату.

2
ответ дан 15 December 2019 в 01:09
поделиться

Я бы, наверное, поместил одну этикетку, затем поместил следующую, проверил, не перекрывает ли она первую, и если да, то переверните ее, если это не сработает, подтолкните ее вверх, пока она не перестанет ' t больше не перекрываются ... в любом случае, в качестве отправной точки. Может быть, добавить функцию стоимости как расстояние от идеального или стандартного размещения (если не было других меток, которые могли бы помешать), которое должно быть минимизировано. Затем найдите самое дешевое расположение этикеток. Может давать переворачивание, и движение, и вращение, и аббревиатуру, и опускание - по разным ценам.

1
ответ дан 15 December 2019 в 01:09
поделиться

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

Я вижу много параллелей с вашей проблемой. Текстовые поля - это узлы, а линии выноски - это края.

Это должно быть изменено. Например, должна быть положительная сила, направленная вверх, чтобы они не опускались ниже графика. Вы' d также нужно включить идею переворачивания текста влево или вправо. Но он должен дать разумный результат для большинства исходных данных.

Статья, на которую я ссылался в своем проекте, была здесь .

1
ответ дан 15 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: