Matplotlib 对数雷达图 - 删除所有低于 0.5 的值并显示最后一个 ytick

Matplotlib Logarithmic Radar Charts - Remove all values below 0.5 and show last ytick

如果您查看下面的对数雷达图,我想做两处更改,如果有人知道正确的编码方式:

1) 显示最大值 (51.81) 的 ytick 标签,因为它当前给出的最大值为 31.62

2)一种将所有低于 0.1 的值设置为 0 的方法,而不会导致被零除错误。

fig = plt.figure(figsize=(8, 8))
ax = fig.add_subplot(111, polar=True)
np.seterr(divide = 'warn') 

sample = samplelistmalshare

get_mag = lambda x: 10**min(np.floor(np.log10(x)))
init_mag = get_mag(sample)
print("init_mag")
print(init_mag)
print("gm")
print(get_mag)

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, color = '#003F5C')


ax.set_xticks(theta)
ax.set_xticklabels(['           Delayed\n           Execution', '            File\n            Opening', 'Firewall\nModification', 'Permission              \nModification              ', 'Persistence                 ', 'Proxied          \nExecution           ', 'Reconnaissance          ', '    Registry\n    Modification', '    Task\n    Stopping'], visible=False)

dat = np.log10(sample)
print(max(dat))
#exit()
ax.set_ylim(0,max(dat))
ax.xaxis.grid(False)

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()])

for test in ax.get_yticks():
  print(test)


for test in ax.get_ymajorticklabels():
  print(test) 
ax.set_rlabel_position(50)
plt.savefig('radarchartingmalshare.pdf',bbox_inches='tight')
fig.clf()
plt.clf()

一种解决方案是手动设置 yticksyticklabels

right_end = 51.81 

ax.set_ylim(0,np.log10(right_end / init_mag))
y_ticks = np.linspace(0,np.log10(right_end/init_mag),10)
ax.set_yticks(y_ticks)
y_ticklabels = ['%.2f' % (init_mag*10**x) if x !=0 else '0.00' for x in ax.get_yticks()]
ax.set_yticklabels(y_ticklabels)

有了这个手动设置的刻度和标签

import numpy as np
from matplotlib import pyplot as plt 


fig = plt.figure(figsize=(8, 8));
ax = fig.add_subplot(111, polar=True)
np.seterr(divide = 'warn') 

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

get_mag = lambda x: 10**min(np.floor(np.log10(x)))
init_mag = get_mag(sample)
sample = np.array(sample) / get_mag(sample)
dat = np.log10(sample)
N = len(sample)

theta = np.arange(0, 2 * np.pi, 2 * np.pi / N)
bars = ax.bar(theta, dat, width=0.4, color = 'deepskyblue')

ax.set_xticks(theta)
ax.xaxis.grid(False)

right_end = 51.81 
ax.set_ylim(0,np.log10(right_end / init_mag))
ax.yaxis.grid(True)

y_ticks = np.linspace(0,np.log10(right_end/init_mag),10)
ax.set_yticks(y_ticks)
y_ticklabels = ['%.2f' % (init_mag*10**x) if x !=0 else '0.00' for x in ax.get_yticks()]
ax.set_yticklabels(y_ticklabels)
ax.tick_params(axis='y',colors='darkviolet')

plt.show()