使用色调颜色为极坐标条形图着色而不会在 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))

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


牧羊人nacy
浏览 248回答 2
2回答

森栏

看起来这个例子需要一些大修。可以简化如下,其中从问题中请求的两个更改是:使用不同的颜色图(此处hsv)。将角度 ( theta) 而不是半径 ( radii)编码为颜色。不需要循环。import numpy as npimport matplotlib.pyplot as plt# Fixing random state for reproducibilitynp.random.seed(19680801)# Compute pie slicesN = 20theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)radii = 10 * np.random.rand(N)width = 2 * np.pi / Ncolors = 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()

杨__羊羊

我将弧度转换为度数并除以 360。要将弧度转换为度数,我使用math.degrees().import math# Use custom colors and opacityfor th, bar in zip(theta, bars):    bar.set_facecolor(plt.cm.hsv(math.degrees(th)/360))    bar.set_alpha(0.8)编辑正如我在评论中提到的,您提供的示例使用hsv颜色映射而不是您使用的颜色映射jet。答案已更新。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python