Раскраска полярной гистограммы цветом оттенка без разрыва в 0 - PullRequest
0 голосов
/ 08 февраля 2019

Мне нужно раскрасить круговую гистограмму цветом, соответствующим углу.

Я нашел пример в библиотеке matplotlib, который окрашивает полярную диаграмму рассеяния так, как мне нужно: https://matplotlib.org/examples/pie_and_polar_charts/polar_scatter_demo.html

Но это диаграмма рассеяния, и мне нужна круговая гистограмма, и я используюкод из ответа на этот вопрос: Круговая гистограмма для Python

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

Вот код для круговой гистограммы:

import numpy as np
import matplotlib.pyplot as plt 

N = 80
bottom = 8
max_height = 4

theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = max_height*np.random.rand(N)
width = (2*np.pi) / N

ax = plt.subplot(111, polar=True)
bars = ax.bar(theta, radii, width=width, bottom=bottom)

# Use custom colors and opacity
for r, bar in zip(radii, bars):
    bar.set_facecolor(plt.cm.jet(r / 10.))
    bar.set_alpha(0.8)

plt.show()

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

bar.set_facecolor(math.degrees(r)/360))

и

bar.set_facecolor(plt.cm.jet(r/2*np.pi))

Оба из них дают неправильное решение.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

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

  1. Использовать другую цветовую карту (здесь hsv).
  2. Кодировать угол (theta) вместо радиуса (radii) в цвет.

Для этого не требуется цикл.

import numpy as np
import matplotlib.pyplot as plt

# Fixing random state for reproducibility
np.random.seed(19680801)

# Compute pie slices
N = 20
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = 2 * np.pi / N
colors = plt.cm.hsv(theta/2/np.pi)

ax = plt.subplot(111, projection='polar')
bars = ax.bar(theta, radii, width=width, bottom=4, color=colors)

plt.show()

enter image description here

0 голосов
/ 08 февраля 2019

Я преобразовал радианы в градусы и разделил на 360. Чтобы преобразовать радианы в градусы, я использую math.degrees().

import math

# Use custom colors and opacity
for th, bar in zip(theta, bars):
    bar.set_facecolor(plt.cm.hsv(math.degrees(th)/360))
    bar.set_alpha(0.8)

РЕДАКТИРОВАТЬ Как я уже упоминал в комментариях, примерВы предоставили использует hsv цветную карту, а не jet, как вы использовали.Ответ обновлен.

enter image description here

...