【问题标题】:Coloring a polar bar chart with hue color without discontinuity at 0用色调颜色为极坐标图着色,在 0 处没有不连续性
【发布时间】:2023-04-01 18:23:01
【问题描述】:

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

我在 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 会更改条形的颜色,但不会产生颜色在整个圆圈范围内连续变化的配色方案。我尝试按照 cmets 中的建议将 theta 标准化为度数和弧度:

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

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

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

【问题讨论】:

  • 目前直方图条根据其半径着色(代码中的radii)。现在您希望它根据角度着色(代码中的theta)。大测验题:您需要替换哪个变量才能发生这种情况?
  • 谢谢,这是有道理的,只需在自定义颜色部分的代码中用半径代替 theta。但这不会产生我需要的颜色(特别是它不会关闭颜色循环)。我尝试了不同的归一化常数,但失败了。
  • 这个因子 10 是多少? theta 以弧度表示。您是否尝试将它们转换为度数?
  • 一个完整的圆包含 2π。所以不是 10 除以 2π。我想你仍然可以更新你的问题,以防你在这样做时遇到问题,但目前还不清楚什么会失败。
  • @ImportanceOfBeingErnest 谢谢,我尝试了弧度和度数,但都在 0 度时产生颜色不连续性(散点图没有)。我会更新问题

标签: python matplotlib pie-chart color-scheme polar-coordinates


【解决方案1】:

看起来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()

【讨论】:

  • 谢谢!这更简单。
  • 这是我对“不需要循环”的赞成票。 +1
【解决方案2】:

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

编辑 正如我在 cmets 中提到的,您提供的示例使用 hsv 颜色映射,而不是您使用的 jet。答案已更新。

【讨论】:

  • 谢谢!我的问题中没有图像,因为我没有足够的“声誉”。但我确实产生了相同的结果,它在 0 处有一个不连续性,而散点图没有。
  • 你能解释一下你所说的 0 度不连续是什么意思吗?
  • 0 时颜色从深红色变为深蓝色。实际上如果你打开散点图链接你可以看到颜色是不同的(例如红色和蓝色之间有粉红色)
  • @Sanya:是的,这是因为散点图示例使用了hsv 颜色图,而您使用的是jet,它以红色和蓝色开始和结束。如果您在我的回答中将jet 替换为hsv,您将得到与散点图中相同的结果,没有任何不连续性
  • @Sanya:我刚刚做到了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 2022-07-25
  • 2015-11-03
  • 2019-08-29
  • 2016-08-05
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多