使用色调颜色为极坐标条形图着色,在 0 处不间断

Coloring a polar bar chart with hue color without discontinuity at 0

我需要用与角度对应的颜色为圆形直方图上色。

我在 matplotlib 库中找到了一个示例,它以我需要的方式为极坐标散点图着色: https://matplotlib.org/examples/pie_and_polar_charts/polar_scatter_demo.html

但这是一个散点图,我需要一个圆形直方图,我使用了这个问题的回复中的代码: Circular Histogram for 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()

编辑:在图的最后部分用半径代替 theta 会改变条形的颜色,但不会产生颜色在整个圆范围内连续变化的配色方案。我尝试按照评论中的建议以度数和弧度对 theta 进行归一化:

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

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

两者都产生了错误的解决方案。

我将弧度转换为度数并除以 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)

EDIT 正如我在评论中提到的,您提供的示例使用 hsv 颜色图,而不是您使用的 jet。答案已更新。

看起来 the example 需要大修。它可以简化如下,其中两个请求的问题更改是:

  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()