首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让雷达条形图列跨越条形图的整个宽度- Matplotlib

让雷达条形图列跨越条形图的整个宽度- Matplotlib
EN

Stack Overflow用户
提问于 2020-12-02 09:49:33
回答 1查看 90关注 0票数 0

一个和善而聪明的人给我画了一张漂亮的matplotlib雷达图。然而,这里的问题是,图表上的条形图不会延伸到它们超过的给定ytick以下。理想情况下,每个值高于1.0的条形应该向下延伸到中心,而不是留下间隙。

我相信这里肯定有一个简单的解决方法,但我在matplotlib中创建雷达图的艺术上是一个非常业余的人。

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, polar=True)

sample = [
    35.417256011315416,
    0.028288543140028287,
    1.3578500707213579,
    3.3663366336633667,
    0.8203677510608205,
    35.445544554455445,
    3.3946251768033946,
    19.46251768033946,
    0.7072135785007072,
]

N = len(sample)

theta = np.arange(0, 2 * np.pi, 2 * np.pi / N)
bars = ax.bar(theta, np.log10(sample), width=0.4)
ax.set_xticks(theta)
#ax.set_xticklabels(range(1, len(theta) + 1))
ax.set_xticklabels(['Delayed\nExecution', 'File\nOpening', 'Firewall\nModification', 'Permission\nModification', 'Persistence', 'Proxied\nExecution', 'Reconnaissance', 'Registry\nModification', 'Task\nStopping'])
ax.yaxis.grid(True)
precision = 2  # Change to your desired decimal precision

ax.set_yticklabels([str(round(10 ** x, precision)) for x in ax.get_yticks()])
#plt.ioff()
plt.show()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-02 10:03:44

问题出在您的数据上,np.log10(sample)返回正值和负值的数组,因此,有些条形图没有扩展。为了让所有条都在同一级别开始,您可以首先缩放samples,以便最小幅度为非负值。

代码语言:javascript
复制
get_mag = lambda x: 10**min(np.floor(np.log10(x)))
sample = np.array(sample) / get_mag(sample)

使用缩放后的sample,您可以绘制数据

代码语言:javascript
复制
get_mag = lambda x: 10**min(np.floor(np.log10(x)))
init_mag = get_mag(sample)
sample = np.array(sample) / get_mag(sample)
N = len(sample)

theta = np.arange(0, 2 * np.pi, 2 * np.pi / N)
bars = ax.bar(theta, np.log10(sample), width=0.4)
ax.set_xticks(theta)
#ax.set_xticklabels(range(1, len(theta) + 1))
ax.set_xticklabels(['Delayed\nExecution', 'File\nOpening', 'Firewall\nModification', 'Permission\nModification', 'Persistence', 'Proxied\nExecution', 'Reconnaissance', 'Registry\nModification', 'Task\nStopping'])

dat = np.log10(sample)
ax.set_ylim(0,max(dat))
ax.yaxis.grid(True)
precision = 2  # Change to your desired decimal precision

ax.set_yticklabels([str(round((10 ** x) * init_mag, precision)) for x in ax.get_yticks()])
#plt.ioff()
plt.show()

输出为

请注意,我还修改了yticks的标签

代码语言:javascript
复制
ax.set_yticklabels([str(round((10 ** x) * init_mag, precision)) for x in ax.get_yticks()])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65101100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档