使用色调颜色为极坐标条形图着色,在 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 需要大修。它可以简化如下,其中两个请求的问题更改是:
- 使用不同的颜色图(此处
hsv
)。
- 将角度 (
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()
我需要用与角度对应的颜色为圆形直方图上色。
我在 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 需要大修。它可以简化如下,其中两个请求的问题更改是:
- 使用不同的颜色图(此处
hsv
)。 - 将角度 (
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()