# 导入库 import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_excel('雷达图.xlsx') # 读取数据表 df = df.set_index('性能评价指标') # 将数据汇总的“性能评价指标”列设置为行索引 df = df.T # 转置数据表格 df.index.name = '品牌' # 将转置后的数据中行索引那一列的名称修改为“品牌” # 自定义一个函数用于制作雷达图 def plot_radar(data, feature): # 设置字体格式 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 指定各个品牌要显示的性能评价指标的名称 cols = ['动力性', '燃油经济性', '制动性', '操控稳定性', '行驶平顺性', '通过性', '安全性', '环保性'] # 为每个品牌设置图表中的显示颜色 colors = ['green', 'blue', 'red', 'yellow'] # 根据要显示的指标个数对圆形进行等分 angles = np.linspace(0.1 * np.pi, 2.1 * np.pi, len(cols), endpoint=False) # 连接刻度线数据 angles = np.concatenate((angles, [angles[0]])) fig = plt.figure(figsize=(8, 8)) # 设置显示图表的窗口大小 ax = fig.add_subplot(111, polar=True) # 设置图表在窗口中的显示位置,并设置坐标轴为极坐标体系 for i, c in enumerate(feature): stats = data.loc[c] # 获取品牌对应的指标数据 stats = np.concatenate((stats, [stats[0]])) # 连接品牌的指标数据 # 制作雷达图 ax.plot(angles, stats, '-', linewidth=6, c=colors[i], label='%s' % (c)) ax.fill(angles, stats, color=colors[i], alpha=0.25) # 为雷达图填充颜色 ax.legend() # 为雷达图添加图例 ax.set_yticklabels([]) # 隐藏坐标轴数据 ax.set_thetagrids(angles * 180 / np.pi, cols, fontsize=16) # 添加并设置数据标签 plt.show() # 显示制作的雷达图 return fig # 调用自定义函数制作雷达图 fig = plot_radar(df, ['A品牌']) # 查看单个品牌的性能评价指标 fig = plot_radar(df, ['A品牌', 'B品牌', 'C品牌', 'D品牌'])
时间: 2024-04-26 18:26:37 浏览: 118
这段代码是用 Python 语言编写的,主要是读取一个名为“雷达图.xlsx”的 Excel 数据表格,并对其进行处理,最终使用自定义函数 plot_radar() 制作雷达图。雷达图是一种多维数据可视化方式,适用于对比多个品牌或者多个方面的表现。在这段代码中,该函数 plot_radar() 接受两个参数:一个是处理后的数据表格 df,另一个是要对比的品牌名称列表 feature。函数会根据品牌名称从数据表格中提取对应的数据,并在雷达图中展示出来。该函数中的很多细节都有详细的注释,比如如何设置字体、颜色、角度等等。最后,该函数还会返回一个 Figure 对象,可以在需要时保存或进一步处理。
相关问题
帮我完善这段代码 import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = pd.read_excel('汽车性能指标分值统计表.xlsx') data = data.set_index('性能评价指标') data = data.T data.index.name = '品牌' def plot_radar(data, feature): columns = ['动力性', '燃油经济性', '制动性', '操控稳定性', '行驶平顺性', '通过性', '安全性', '环保性', '方便性', '舒适性', '经济性', '容量性'] # 设置要展示的性能评价指标 colors = ['r', 'g', 'y'] # 设置每个品牌在图表中的图例颜色 angles = np.linspace(0.1 * np.pi, 2.1 * np.pi, len(columns), endpoint=False) # 根据要显示的指标个数对圆形进行等分 angles = np.concatenate((angles, [angles[0]])) # 连接刻度线数据 figure = plt.figure(figsize=(6, 6)) ax = figure.add_subplot(1, 1, 1, projection='polar') for i, c in enumerate(feature): #列举 stats = data.loc[c] #stats(统计的缩写) stats = np.concatenate((stats, [stats[0]])) ax.plot(angles, stats, '-', linewidth=2, c=colors[i], label=str(c)) ax.fill(angles, stats, color=colors[i], alpha=0.75) ax.legend(loc=4, bbox_to_anchor=(1.15, -0.07)) ax.set_yticklabels([2, 4, 6, 8, 10]) ax.set_thetagrids(angles * 180 / np.pi, columns, fontsize=12) plt.show() return figure figure = plot_radar(data, ['A品牌', 'B品牌', 'C品牌'])
这段代码是画雷达图,但是有一些可以完善的地方:
1. 可以在函数定义时添加函数说明文档,以便其他人更好地理解函数的作用和参数含义。
2. `plot_radar` 函数的最后一行 `return figure` 可以省略,因为并没有在函数中创建 `figure` 对象。
3. `plot_radar` 函数的参数 `feature` 可以改为更加直观的参数名,例如 `brands`。
4. `plt.show()` 可以放在函数外面,以便更好地控制图表的展示。
修改后的代码如下所示:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_excel('汽车性能指标分值统计表.xlsx')
data = data.set_index('性能评价指标')
data = data.T
data.index.name = '品牌'
def plot_radar(data: pd.DataFrame, brands: list):
"""
画雷达图
:param data: 数据,包含各个品牌在各个性能评价指标上的得分
:param brands: 要展示的品牌列表
:return: None
"""
columns = ['动力性', '燃油经济性', '制动性', '操控稳定性', '行驶平顺性', '通过性', '安全性', '环保性', '方便性', '舒适性', '经济性', '容量性']
colors = ['r', 'g', 'y']
angles = np.linspace(0.1 * np.pi, 2.1 * np.pi, len(columns), endpoint=False)
angles = np.concatenate((angles, [angles[0]]))
figure = plt.figure(figsize=(6, 6))
ax = figure.add_subplot(1, 1, 1, projection='polar')
for i, brand in enumerate(brands):
stats = data.loc[brand]
stats = np.concatenate((stats, [stats[0]]))
ax.plot(angles, stats, '-', linewidth=2, c=colors[i], label=str(brand))
ax.fill(angles, stats, color=colors[i], alpha=0.75)
ax.legend(loc=4, bbox_to_anchor=(1.15, -0.07))
ax.set_yticklabels([2, 4, 6, 8, 10])
ax.set_thetagrids(angles * 180 / np.pi, columns, fontsize=12)
return figure
brands = ['A品牌', 'B品牌', 'C品牌']
figure = plot_radar(data, brands)
plt.show()
```
import requests import pandas as pd from bs4 import BeautifulSoup # 发送请求获取网页内容 url = "https://nba.hupu.com/stats/players" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "Referer": "https://nba.hupu.com/stats/players" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 解析数据并保存到Excel表格中 table = soup.find_all('table', attrs={'class': 'players_table'})[0] df = pd.read_html(str(table))[0] df.to_excel('player_stats.xlsx', index=False)给以上代码绘制一个雷达图
很抱歉,作为一个语言模型,我不能直接绘制雷达图。不过,您可以使用 Python 中的 matplotlib 库来绘制雷达图。
首先,您需要从 `player_stats.xlsx` 文件中读取数据,并选择您想要绘制的球员的数据。然后,将这些数据传递给雷达图的 `plot` 函数。以下是一个简单的例子:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_excel('player_stats.xlsx', header=1)
# 选择球员
player_name = 'Stephen Curry'
player_data = df[df['球员'] == player_name].iloc[:, 2:].values[0]
# 绘制雷达图
categories = df.columns[2:]
N = len(categories)
angles = np.linspace(0, 2*np.pi, N, endpoint=False)
player_data = np.concatenate((player_data, [player_data[0]]))
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, player_data, 'o-', linewidth=2)
ax.fill(angles, player_data, alpha=0.25)
ax.set_thetagrids(angles * 180/np.pi, categories)
ax.set_title(player_name)
ax.grid(True)
plt.show()
```
代码中,我们选择了 Stephen Curry 的数据,并绘制了一个雷达图。您只需要将 `player_name` 修改为您想要绘制的球员即可。同时,您也可以根据需要修改图表的标题、线条颜色、填充颜色等参数。
阅读全文