跟着GPT学习画雷达图:一张图看懂多款车型的性能优劣!

文摘   2024-08-01 23:49   德国  

用汽车销售数据展示和学习雷达图+唤醒注释

雷达图(Radar Chart),又称蜘蛛图或蛛网图,是一种多变量数据图形,能直观地展示各个变量的比较情况,进而帮助我们做出最好的选择。今天,就让我们使用一组车辆销售数据来学习如何绘制雷达图并用雷达图吧!

雷达图的自我介绍

在我们开始学习如何绘制并使用雷达图之前,让我们再多了解一下雷达图本身吧。它的优点;它的缺点,这些都能帮助我们更好的理解并应用雷达图。

雷达图的特点

  • 多变量比较:雷达图能够在一个图形中显示多个变量的数据,适合对比对象在多个维度上的表现。
  • 圆形布局:数据点按照相等角度分布在一个圆形网格上,直观地展示各变量的值。
  • 直观展示:通过连接各数据点形成多边形,直观地展示各变量的相对值和变化趋势。

雷达图的优点

  • 多维数据可视化:能够同时展示多个维度的数据,非常适合用于多维数据的比较。
  • 易于理解:通过图形化展示,便于非专业人士理解和分析数据。
  • 直观比较:通过对比不同对象的多边形形状和面积,快速了解其优劣。
  • 灵活性:可以轻松添加或删除变量,灵活调整图形内容。

雷达图的缺点

  • 难以处理大量变量:当变量较多时,图形会变得复杂难以解读。

  • 精度有限:难以精确展示具体数值,主要用于相对比较。

  • 中心聚集效应:数值较小的变量聚集在中心,容易被忽视。

  • 易产生视觉误导:多边形面积可能会误导观察者对数据的理解,特别是当变量之间的量级差异较大时。

光说不练假把式

数据集介绍

我们今天用的数据集来自kaggle,是一个集取自Analytixlabs的汽车销售数据集,其中包含有关不同汽车的信息。我们今天将用雷达图来看看哪个品牌的车最值得购买。https://www.kaggle.com/datasets/gagandeep16/car-sales

数据集小样

在我们开始绘图之前,我们需要注意一点,我们使用的数据集中包含了很多品牌的不同车型,

载入环境

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

读入数据

# 将我们的数据读入并制作成dataframe
df = pd.read_csv('/content/Car_sales.csv')

选择要比较的特征

# 选择我们想要的特征
categories = ['Sales_in_thousands','__year_resale_value''Price_in_thousands','Engine_size''Horsepower','Wheelbase','Width','Length''Fuel_efficiency','Curb_weight','Fuel_capacity','Power_perf_factor']

数据标准化

# 标准化我们的数据
df[categories] = df[categories].apply(lambda x: (x - x.min()) / (x.max() - x.min()))

绘图

# 生成图表的方程
def create_radar_plot(data, title):
    labels = list(data.columns)
    num_vars = len(labels)

    angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()
    angles += angles[:1]

    fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
    
    for i in range(len(data)):
        values = data.iloc[i].tolist()
        values += values[:1]
        ax.plot(angles, values, linewidth=1, linestyle='solid', label=data.index[i])
        ax.fill(angles, values, alpha=0.1)
    
    ax.set_yticklabels([])
    ax.set_xticks(angles[:-1])
    ax.set_xticklabels(labels)
    ax.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))

    plt.title(title)
    plt.show()

# 绘制图表
radar_data = df.set_index('Model')[categories]
create_radar_plot(radar_data, 'Car Features Radar Plot')
效果图

我太想进步了

如大家所见,我们用所有数据进行绘制的雷达图是基本完全不可读的,数据量太大了。我们可以通过限制变量数量的办法解决这个问题。具体上来讲,与其对比所有车辆的数据,不如对比每个品牌的平均值。

对车辆数据基于品牌分组并求每组的平均值

# 舍弃掉‘Model’和‘Vehicle_type'还有’Latest_Launch‘,我认为这些特征在选择车辆是并不重要
df = df.drop(columns=['Model''Vehicle_type','Latest_Launch'])
# 将Dataframe按照品牌分类并计算每个分类的平均值
df = df.groupby('Manufacturer').mean()

除了对数据进行分组,我们还需要对前面的代码进行一些改动

# 绘制图表的方程
def create_radar_plot(data, title):
    labels = list(data.columns)
   ...
   ...
   ...
# 绘制图表 
radar_data = df[categories]
create_radar_plot(radar_data, 'Car Features Radar Plot')
品牌比较效果图

继续进步!

品牌比较雷达图看起来好多了,但是依旧看不懂,所以我们要进一步的减少数据量

品牌比较

我们可以选择两个或多个品牌进行直接比较,在我们的示例代码里,我选择了奥迪和宝马两个品牌的车辆平均值进行对比

# 用我们选择的行制作新的Dataframe
df_chosen_rows = df.loc[chosen_indices]

# 选择我们想要的特征
categories = ['Sales_in_thousands','__year_resale_value''Price_in_thousands','Engine_size''Horsepower','Wheelbase','Width','Length''Fuel_efficiency','Curb_weight','Fuel_capacity','Power_perf_factor']

# 注意我们这次不在让我们的数据标准化
#df[categories] = df[categories].apply(lambda x: (x - x.min()) / (x.max() - x.min()))

# 绘图方程
def create_radar_plot(data, title):
    labels = list(data.columns)
    num_vars = len(labels)

    angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()
    angles += angles[:1]

    fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))

    for i in range(len(data)):
        values = data.iloc[i].tolist()
        values += values[:1]
        ax.plot(angles, values, linewidth=1, linestyle='solid', label=data.index[i])
        ax.fill(angles, values, alpha=0.1)

    ax.set_yticklabels([])
    ax.set_xticks(angles[:-1])
    ax.set_xticklabels(labels)
    ax.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))

    plt.title(title)
    plt.show()

# 绘制图表
radar_data = df[categories]
create_radar_plot(radar_data, 'Car Features Radar Plot')
print(df)

由于我们只对几个品牌进行对比,我们不再需要对我们的数据进行标准化处理

车型比较

在我们大致比较了各个品牌的优劣之后,我们可以进一步比较我们所选择的品牌的各个车型的优劣。


# 读入数据
df = pd.read_csv('/content/Car_sales.csv')
# 选择我们想比较的品牌并制作成新的Dataframe
df = df[df['Manufacturer'] == 'BMW']

# 选择我们想要的特征
categories = ['Sales_in_thousands','__year_resale_value''Price_in_thousands','Engine_size''Horsepower','Wheelbase','Width','Length''Fuel_efficiency','Curb_weight','Fuel_capacity','Power_perf_factor']

# 制图的方程
def create_radar_plot(data, labels, title):
    num_vars = len(categories)

    angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()
    angles += angles[:1]

    fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))

    for i in range(len(data)):
        values = data.iloc[i].tolist()
        values += values[:1]
        ax.plot(angles, values, linewidth=1, linestyle='solid', label=labels[i])
        ax.fill(angles, values, alpha=0.1)

    ax.set_yticklabels([])
    ax.set_xticks(angles[:-1])
    ax.set_xticklabels(categories)
    ax.legend(loc='upper right', bbox_to_anchor=(0.1, 0.1))

    plt.title(title)
    plt.show()

# 绘制图表
radar_data = df[categories]
model_labels = df['Model'].tolist()
create_radar_plot(radar_data, model_labels, 'Car Features Radar Plot')

print(df)
宝马车辆比较

本文作者:徐可


现在:


长按扫码关注:科研生信充电宝


10元赞赏本文,即喜欢作者~


即可直接解锁:


《跟着GPT学习画雷达图:一张图看懂多款车型的性能优劣!》对应资源哦~


看到这里你还不心动吗?


赶紧关注、转发、点赞、分享,领取你的专属福利吧~



好啦,以上就是今天推文的全部内容啦!


版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本公众号不拥有所有权,也不承担相关法律责任。

如果您发现本公众号中有涉嫌抄袭的内容,欢迎发送邮件至:kysxcdb@163.com 进行举报,一经查实,本公众号将立刻删除涉嫌侵权内容。


科研生信充电宝
介绍科研;介绍统计;介绍生信;
 最新文章