我正在尝试创建一个有四个类别的极坐标图。每个类别都有两个值:
sleep_time
和 ahi
。我希望每个条形的大小与 sleep_time
成比例 - 这似乎有效。我还希望颜色基于也与每个类别相关联的 ahi
。然后有一个颜色条来反映这一点。我可以运行 sleep_time
功能,但我的颜色是问题。这是我到目前为止所拥有的:
import matplotlib.pyplot as plt
import numpy as np
categories = ['Right', 'Supine', 'Left', 'Prone']
sleep_time = [251.5, 40, 130, 15.5]
ahi = [12.5, 65.6, 8.2, 0.0]
angles = np.linspace(0, 2*np.pi, len(categories), endpoint=False)
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(projection='polar'))
colors = plt.cm.viridis_r(np.linspace(0, 100, len(ahi)))
ax.bar(angles, sleep_time, width=1.0, align='center', alpha=0.5)
ax.bar(angles, ahi, width=0.4, align='edge', alpha=0.5, color=colors)
ax.set_xticks(angles)
ax.set_xticklabels(categories)
colorbar = plt.colorbar(ahi)
colorbar.set_ticks([0, 30, 60, 90, 120, 150, 180])
plt.show()
plt.savefig('position_vs._ahi.png')
你就快到了。只需更改
ahi
创建颜色的方式即可。也无需添加 2 个栏,您可以直接将 ahi
中的值添加为 color=
中的 ax.bar
参数。然后添加 Mappable
以获得符合 ahi
的颜色条:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.cm import ScalarMappable
from matplotlib.colors import Normalize
categories = ['Right', 'Supine', 'Left', 'Prone']
sleep_time = [251.5, 40, 130, 15.5]
ahi = [12.5, 65.6, 8.2, 0.0]
angles = np.linspace(0, 2*np.pi, len(categories), endpoint=False)
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='polar')
norm = Normalize(vmin=min(ahi), vmax=max(ahi))
cmap = plt.cm.viridis_r
colors = cmap(norm(ahi))
bars = ax.bar(angles, sleep_time, width=0.8, align='center', alpha=0.7, color=colors)
ax.set_xticks(angles)
ax.set_xticklabels(categories)
sm = ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])
colorbar = fig.colorbar(sm, ax=ax)
colorbar.set_label('AHI Value', rotation=270, labelpad=15)
plt.tight_layout()
plt.show()