python - 如何将轮盘赌轮背景图像添加到 matplotlib 雷达图

标签 python matplotlib background-image radar-chart

我有一个程序,可以将轮盘赌数字的命中频率绘制到雷达图上。我想要一张轮圈外缘/雷达图外部边框的图像。我尝试过在线获取代码,但收到错误:

    raise TypeError("Image data cannot be converted to float")
TypeError: Image data cannot be converted to float

我正在使用的代码示例(见下文)生成以下图:

enter image description here

from math import pi
import matplotlib.pyplot as plt
from scipy.misc import imread
import matplotlib.cbook as cbook

# Numbers of European Roulette Wheel
cat = [0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36, 11, 30, 8, 23, 10, 5, 24, 16, 33, 1, 20, 14, 31, 9, 22, 18, 29, 7, 28, 12, 35, 3, 26]

# Hit frequency of each number
values = [108, 116, 102, 100, 102, 107, 115, 114, 110, 102, 114, 101, 121, 103, 121, 105, 104, 117, 108, 121, 122, 97, 114, 122, 98, 105, 114, 111, 129, 123, 107, 112, 124, 102, 124, 109, 107]

N = len(cat)
x_as = [n / float(N) * 2 * pi for n in range(N)]

# Because our chart will be circular we need to append a copy of the first 
# value of each list at the end of each list with data
values += values[:1]
x_as += x_as[:1]

# Set color of axes
plt.rc('axes', linewidth=0.5, edgecolor="#888888")

# Create polar plot
ax = plt.subplot(111, polar=True)

# Set clockwise rotation. That is:
ax.set_theta_offset(pi / 2)
ax.set_theta_direction(-1)

# Set position of y-labels
ax.set_rlabel_position(0)

# Set color and linestyle of grid
ax.xaxis.grid(True, color="#888888", linestyle=':', linewidth=0.5)
ax.yaxis.grid(True, color="#888888", linestyle=':', linewidth=0.5)

# Set number of radial axes and remove labels
plt.xticks(x_as[:-1], [])

# Set yticks
tickInt = []
tickStr = []
y = 0
maxHitFrequency = max(values)

while y <= maxHitFrequency:
    tickInt.append(y)
    tickStr.append(str(y))
    y += 25

plt.yticks(tickInt, tickStr)

# Plot data
ax.plot(x_as, values, linewidth=0, linestyle='solid', zorder=3)

# Fill area
ax.fill(x_as, values, 'b', alpha=0.45, color="#006600")

# Set axes limits
plt.ylim(0, y)   

plt.show()

我想让绘图带有与此类似的图像边框: enter image description here

下面是我尝试过但无济于事的代码:

# Display Image
datafile = cbook.get_sample_data('D:\AR Wheel Vector.jpg')
img = imread(datafile)
plt.imshow(img)

最佳答案

我认为很难将图像精确定位到适合极坐标图的位置。因此,我宁愿尝试在 matplotlib 图中重新创建轮盘赌板。

enter image description here

这个想法主要是创建许多颜色交替的矩形,并将数字作为文本放入其中。其中大部分工作可以通过使用 theta 轴的轴变换 ax.get_xaxis_tranform() 轻松完成,这样角坐标就是角度(数据单位),径向坐标就是轴坐标 (轴内的 01)。

import numpy as np
import matplotlib.pyplot as plt

# Numbers of European Roulette Wheel
cat = [0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36, 11, 30, 8, 23, 10, 5,
       24, 16, 33, 1, 20, 14, 31, 9, 22, 18, 29, 7, 28, 12, 35, 3, 26]

# Hit frequency of each number
values = [108, 116, 102, 100, 102, 107, 115, 114, 110, 102, 114, 101, 121, 103, 
          121, 105, 104, 117, 108, 121, 122, 97, 114, 122, 98, 105, 114, 111, 129, 
          123, 107, 112, 124, 102, 124, 109, 107]

N = len(cat)
x_as = [n / float(N) * 2 *  np.pi for n in range(N)]

# Because our chart will be circular we need to append a copy of the first 
# value of each list at the end of each list with data
values += values[:1]
x_as += x_as[:1]

# Set color of axes
plt.rc('axes', linewidth=0.5, edgecolor="#888888")

# Create polar plot
ax = plt.subplot(111, polar=True)

# Set clockwise rotation. That is:
ax.set_theta_offset(np.pi / 2)
ax.set_theta_direction(-1)

# Set position of y-labels
ax.set_rlabel_position(0)

# Set color and linestyle of grid
ax.xaxis.grid(True, color="#888888", linestyle=':', linewidth=0.5)
ax.yaxis.grid(True, color="#888888", linestyle=':', linewidth=0.5)

# Set number of radial axes and remove labels
plt.xticks(x_as[:-1], [])

## Set yticks
yticks = np.arange(0,max(values),25)
plt.yticks(yticks, yticks)

# Plot data
ax.plot(x_as, values, linewidth=0, linestyle='solid', zorder=3)

# Fill area
ax.fill(x_as, values, 'b', alpha=0.45, color="#006600")

# Set axes limits
plt.ylim(0, np.ceil(max(values)/25.)*25) 


x_bin = np.array(x_as)[:-1]-np.diff(x_as)[0]/2.
c = ["#fe0000" if i%2 else "#000000" for i in range(len(x_bin))]
c[0] = "#007f0e"
for i in range(len(x_bin)):
    rec = plt.Rectangle([x_bin[i],1],np.diff(x_as)[0],0.22 ,
                    transform=ax.get_xaxis_transform(), 
                    color=c[i], clip_on=False)
    ax.add_patch(rec)
    ax.text(x_as[i], 1.1, cat[i],transform=ax.get_xaxis_transform(),
            ha="center", va="center", color="w", size=12, weight='bold', family="serif",
            rotation_mode="anchor", rotation=-np.rad2deg(x_as[i]))

ang = np.linspace(0,2*np.pi,200)
kw = dict(clip_on=False, lw=3,transform=ax.get_xaxis_transform())
ax.plot(ang,np.ones_like(ang), color="k", **kw)
ax.plot(ang,np.ones_like(ang)*1.22, color="w",**kw)

plt.show()

关于python - 如何将轮盘赌轮背景图像添加到 matplotlib 雷达图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49554591/

相关文章:

Python urlparse——提取没有子域的域名

python - 如何传递文件中包含的命令行参数并保留该文件的名称?

python - 为什么这不是无限递归?

html - 我想要一个带有叠加文本的模糊背景图像

python - 根据字符串条件填充缺失值

python - 使用 savefig 时生成较小文件大小的 PNG 选项

python - 使用 matplotlib 和 numpy 对图像应用复杂的变换

python - matplotlib 后端对渲染格式有什么限制?

html - 当 ng 服务 Angular 应用程序时,在组件 css 中配置的背景图像不考虑相对路径

java - 使用JMenuBar、JMenu和JMenuItem自行设计菜单栏时呈现奇怪的效果