Пользовательские маркеры с использованием Python (matplotlib)

Я хотел бы знать, как я могу создать маркер для черной линии, показанной на этом рисунке. (Источник: NCEP и NOAA) Это маркер шторма или урагана на стандартных картах погоды.

введите здесь описание изображения

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


person Kushal    schedule 23.06.2017    source источник


Ответы (1)


Маркер выглядит как 6. В этом случае вы можете использовать 6 в качестве маркера следующим образом:

import matplotlib.pyplot as plt

x = [1,2,3,4]
y = [2,3,1,4]

plt.scatter(x,y, s= 100,marker="$6$")

plt.show()

введите здесь описание изображения

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

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

def get_hurricane():
    u = np.array([  [2.444,7.553],
                    [0.513,7.046],
                    [-1.243,5.433],
                    [-2.353,2.975],
                    [-2.578,0.092],
                    [-2.075,-1.795],
                    [-0.336,-2.870],
                    [2.609,-2.016]  ])
    u[:,0] -= 0.098
    codes = [1] + [2]*(len(u)-2) + [2] 
    u = np.append(u, -u[::-1], axis=0)
    codes += codes

    return mpath.Path(3*u, codes, closed=False)

hurricane = get_hurricane()
plt.scatter([1,1,2],[1.4,2.3,2.8], s=350, marker=hurricane, 
            edgecolors="crimson", facecolors='none', linewidth=2)
plt.scatter([0,1,2],[1,3,1], s=150, marker=hurricane, 
            edgecolors="k", facecolors='none')
plt.scatter([0,1.8,3],[0,2,4], s=150, marker="o", 
            edgecolors="k", facecolors='none')

plt.show()

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 24.06.2017
comment
Маркер используется для обозначения урагана. Это особый символ. Я сомневаюсь, что предложенный символ работает. - person Kushal; 24.06.2017
comment
Где мы можем найти информацию об этом символе? Если вам нужна помощь в создании маркера, вы должны каким-то образом определить, как этот маркер должен выглядеть. - person ImportanceOfBeingErnest; 24.06.2017
comment
Извини за это. Второй и третий символы на этом изображении — это то, что я прийти к. - person Kushal; 24.06.2017
comment
Спасибо за решение. Я был бы рад, если бы вы могли объяснить, как вы пришли к символу. Кроме того, то, что вы сделали, относится к тропическому шторму. Для тропического циклона необходимо заполнить круглую область внутри символа тропического шторма. Это тоже возможно? - person Kushal; 25.06.2017
comment
Решение показывает, как получить пользовательский маркер, используя пары координат. Он использует некоторые значения, чтобы получить половину символа, а затем отражает их, чтобы получить полный символ. Вы можете заполнить символ (например, цвет лица = красный), но это будет выглядеть не очень хорошо. Вместо этого вы можете использовать второй скаттер, который обеспечивает заполненную часть. Либо так же, как первый работает, предоставляя координаты, либо просто используя круг в качестве маркера. - person ImportanceOfBeingErnest; 26.06.2017
comment
Спасибо за объяснение. Я смог заполнить цвет внутри маркера разбросом, как вы упомянули. Тем не менее, я до сих пор, кажется, не понимаю математику, стоящую за функцией, которую вы определили для создания самого маркера. Было бы здорово, если бы вы могли объяснить, как вы нашли координаты кривой и почему вы возвращаете два значения (3 * u и коды). - person Kushal; 27.06.2017
comment
Я придумал несколько точек для определения полуспирали. Затем переместите эту полуспираль так, чтобы ее точка отражения стала исходной точкой (переместите на 0,098 в направлении x). Путь в matplotlib состоит из двух частей: координат и кодов. Код 1 означает переход, а код 2 означает строку. Множитель 3 в координатах должен сделать символ того же размера, что и круглый маркер. Конечно, вы можете напрямую жестко закодировать значение 0,098 и коэффициент 3 в координатах, если хотите. - person ImportanceOfBeingErnest; 27.06.2017
comment
Большое спасибо за объяснение! Теперь я понимаю это намного лучше! - person Kushal; 28.06.2017