一个和善而聪明的人给我画了一张漂亮的matplotlib雷达图。然而,这里的问题是,图表上的条形图不会延伸到它们超过的给定ytick以下。理想情况下,每个值高于1.0的条形应该向下延伸到中心,而不是留下间隙。
我相信这里肯定有一个简单的解决方法,但我在matplotlib中创建雷达图的艺术上是一个非常业余的人。
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()

发布于 2020-12-02 10:03:44
问题出在您的数据上,np.log10(sample)返回正值和负值的数组,因此,有些条形图没有扩展。为了让所有条都在同一级别开始,您可以首先缩放samples,以便最小幅度为非负值。
get_mag = lambda x: 10**min(np.floor(np.log10(x)))
sample = np.array(sample) / get_mag(sample)使用缩放后的sample,您可以绘制数据
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的标签
ax.set_yticklabels([str(round((10 ** x) * init_mag, precision)) for x in ax.get_yticks()])https://stackoverflow.com/questions/65101100
复制相似问题