Как раскрасить круговые линии в полярной диаграмме (matplotlib) - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь закрасить круговую линию, которая соответствует значению 0 в полярной диаграмме.Вот чего я хочу добиться:

enter image description here

По этому смежному вопросу ( Затенение сегмента между двумя линиями на полярной оси (matplotlib) ), ax.fill_between используется для заполнения пробела между двумя значениями, но я ищу способ закрасить только круговую линию, где значение для каждой переменной равно 0.

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

import matplotlib.pyplot as plt
import pandas as pd    

def make_spider(row, title, color):

    import math

    categories = list(df)
    N = len(categories)

    angles = [n / float(N) * 2 * math.pi for n in range(N)]
    angles += angles[:1]

    ax = plt.subplot(1, 5, row+1, polar=True)

    plt.xticks(angles[:-1], categories, color='grey', size=8)

    values = df.iloc[row].values.flatten().tolist()
    values += values[:1]

    ax.plot(angles, values, color=color, linewidth=2, linestyle='solid')
    ax.fill(angles, values, color=color, alpha = .4)

    plt.gca().set_rmax(.4)


my_dpi = 40

plt.figure(figsize=(1000/my_dpi, 1000/my_dpi), dpi=96)

my_palette = plt.cm.get_cmap('Set2', len(df.index)+1)


for row in range(0, len(df.index)):
     make_spider( row  = row, title='Cluster: ' + str(row), color=my_palette(row) )

Пример кадра данных здесь:

df = pd.DataFrame.from_dict({"no_rooms":{"0":-0.3470532925,"1":-0.082144001,"2":-0.082144001,"3":-0.3470532925,"4":-0.3470532925},"total_area":{"0":-0.1858487321,"1":-0.1685491141,"2":-0.1632483955,"3":-0.1769700284,"4":-0.0389887094},"car_park_spaces":{"0":-0.073703681,"1":-0.073703681,"2":-0.073703681,"3":-0.073703681,"4":-0.073703681},"house_price":{"0":-0.2416123064,"1":-0.2841806825,"2":-0.259622004,"3":-0.3529449824,"4":-0.3414842657},"pop_density":{"0":-0.1271390651,"1":-0.3105853643,"2":-0.2316607937,"3":-0.3297832328,"4":-0.4599021194},"business_rate":{"0":-0.1662745006,"1":-0.1426329043,"2":-0.1577528867,"3":-0.163560133,"4":-0.1099718326},"noqual_pc":{"0":-0.0251535462,"1":-0.1540641646,"2":-0.0204666924,"3":-0.0515740013,"4":-0.0445135996},"level4qual_pc":{"0":-0.0826103951,"1":-0.1777759951,"2":-0.114263357,"3":-0.1787044751,"4":-0.2709496389},"badhealth_pc":{"0":-0.105481688,"1":-0.1760349683,"2":-0.128215043,"3":-0.1560577648,"4":-0.1760349683}})

1 Ответ

0 голосов
/ 19 декабря 2018

Вероятно, дешевый взлом на основе ссылки, которой вы поделились.Хитрость заключается в том, чтобы просто использовать 360 градусов для fill_between, а затем использовать очень тонкую область вокруг круглой линии для 0, используя поля, например от -0.005 до 0.005.Таким образом, вы убедитесь, что кривая центрирована вокруг линии 0.Чтобы сделать линию толще / тоньше, вы можете увеличить / уменьшить это число.Это может быть просто расширено, чтобы закрасить все круглые линии, поместив его в цикл for.

ax.plot(angles, values, color=color, linewidth=2, linestyle='solid')
ax.fill(angles, values, color=color, alpha = .4)
ax.fill_between(np.linspace(0, 2*np.pi, 100), -0.005, 0.005, color='red', zorder=10) # <-- Added here

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

circle = plt.Circle((0, 0), 0.36, transform=ax.transData._b, fill=False, edgecolor='red', linewidth=2, zorder=10)
plt.gca().add_artist(circle)

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

enter image description here

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