最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Matplotlib繪制平行坐標(biāo)系的示例詳解

 更新時(shí)間:2023年07月03日 14:33:48   作者:databook  
平行坐標(biāo)系,是一種含有多個(gè)垂直平行坐標(biāo)軸的統(tǒng)計(jì)圖表,這篇文章主要為大家介紹了如何使用繪制平行坐標(biāo)系,需要的小伙伴可以參考一下

平行坐標(biāo)系,是一種含有多個(gè)垂直平行坐標(biāo)軸的統(tǒng)計(jì)圖表。

一般的分析圖表都是分析二維的數(shù)據(jù),而平行坐標(biāo)系特別適合于分析維度較多的數(shù)據(jù)。

比如,對(duì)于學(xué)生成績,每門學(xué)科都是一個(gè)維度,且每門學(xué)科的最高分也不一樣,用單一的坐標(biāo)系很難展示分析結(jié)果。

平行坐標(biāo)系的圖大概是下面這樣的:

多個(gè)Y軸代表數(shù)據(jù)不同的屬性(維度),每個(gè)Y軸的刻度可以是不一樣的。

1. 準(zhǔn)備示例數(shù)據(jù)

準(zhǔn)備一些學(xué)生各個(gè)科目的成績數(shù)據(jù),用來分析整體學(xué)習(xí)情況以及是否有偏科的情況。

姓名語文數(shù)學(xué)英語物理化學(xué)
學(xué)生A100120988878
學(xué)生B1051331098789
學(xué)生C80112879095
學(xué)生D9089768988
學(xué)生E10260906665

假設(shè):

  • 語文滿分 120
  • 數(shù)學(xué)滿分 150
  • 英語滿分 110
  • 物理滿分 90
  • 化學(xué)滿分100

2. 封裝繪圖函數(shù)

python的繪圖函數(shù)庫matplotlib中,默認(rèn)沒有提供繪制平行坐標(biāo)系的接口。

但是,基于matplotlib 提供的繪圖底層接口,也可以很容易封裝一個(gè)繪制平行坐標(biāo)系的類。

2.1. 屬性封裝

根據(jù)平行坐標(biāo)系上的常用元素,封裝的屬性主要包括:

名稱類型說明
titlestring 字符串標(biāo)題
x_labelslist 列表每一行數(shù)據(jù)的名稱,list的長度就是數(shù)據(jù)的行數(shù)
y_labelslist 列表每一個(gè)平行的Y軸的名稱,list的長度就是平行的Y軸的個(gè)數(shù)
y_datalist[list] 二維列表數(shù)據(jù)行數(shù)就是x_labels的長度,數(shù)據(jù)的列數(shù)就是y_labels的長度
y_minslist 列表每個(gè)平行的Y軸的最小值
y_maxslist 列表每個(gè)平行的Y軸的最大值
class ParallelCoord:
    """
    平行坐標(biāo)系
    """
    def __init__(self, title, x_labels, y_labels, y_data, y_min, y_max):
        self.title = title
        self.x_labels = x_labels
        self.y_labels = y_labels
        self.y_data = y_data
        self.y_min = y_min
        self.y_max = y_max

2.2. 繪圖封裝

繪圖的步驟主要有:

  • 設(shè)置畫布
  • 設(shè)置標(biāo)題
  • 設(shè)置各個(gè)平行的Y軸
  • 設(shè)置X軸
  • 在平行坐標(biāo)系中繪制曲線
  • 繪制圖例
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
import numpy as np
class ParallelCoord:
    """
    平行坐標(biāo)系
    """
    def __init__(self, title, x_labels, y_labels, y_data, y_mins, y_maxs):
        self.title = title
        self.x_labels = x_labels
        self.y_labels = y_labels
        self.y_data = y_data
        self.y_mins = y_mins
        self.y_maxs = y_maxs
    def draw(self):
        # 1. 設(shè)置畫布
        fig, host = plt.subplots(figsize=(10, 4))
        # 2. 設(shè)置標(biāo)題
        host.set_title(self.title, fontsize=18, pad=12)
        # 3. 設(shè)置各個(gè)平行的Y軸
        # 每個(gè)坐標(biāo)系的上下限不一樣,調(diào)整顯示方式
        dys = np.array(self.y_maxs) - np.array(self.y_mins)
        zs = np.zeros_like(self.y_data)
        zs[:, 0] = self.y_data[:, 0]
        zs[:, 1:] = (self.y_data[:, 1:] - self.y_mins[1:]) / dys[1:] * dys[
            0
        ] + self.y_mins[0]
        axes = [host] + [host.twinx() for i in range(len(self.y_labels) - 1)]
        for i, ax in enumerate(axes):
            ax.set_ylim(self.y_mins[i], self.y_maxs[i])
            ax.spines["top"].set_visible(False)
            ax.spines["bottom"].set_visible(False)
            if ax != host:
                ax.spines["left"].set_visible(False)
                ax.yaxis.set_ticks_position("right")
                ax.spines["right"].set_position(("axes", i / (len(self.y_labels) - 1)))
        # 4. 設(shè)置X軸
        host.set_xlim(0, len(self.y_labels) - 1)
        host.set_xticks(range(len(self.y_labels)))
        host.set_xticklabels(self.y_labels, fontsize=14)
        host.tick_params(axis="x", which="major", pad=7)
        host.spines["right"].set_visible(False)
        host.xaxis.tick_top()
        # 5. 在平行坐標(biāo)系中繪制曲線
        colors = plt.cm.Set1.colors
        legend_handles = [None for _ in self.x_labels]
        for j in range(len(self.x_labels)):
            verts = list(
                zip(
                    [
                        x
                        for x in np.linspace(
                            0,
                            len(self.y_data) - 1,
                            len(self.y_data) * 3 - 2,
                            endpoint=True,
                        )
                    ],
                    np.repeat(zs[j, :], 3)[1:-1],
                )
            )
            codes = [Path.MOVETO] + [Path.CURVE4 for _ in range(len(verts) - 1)]
            path = Path(verts, codes)
            patch = patches.PathPatch(
                path, facecolor="none", lw=2, alpha=0.7, edgecolor=colors[j]
            )
            legend_handles[j] = patch
            host.add_patch(patch)
        # 6. 繪制圖例
        host.legend(
            self.x_labels,
            loc="lower center",
            bbox_to_anchor=(0.5, -0.18),
            ncol=len(self.x_labels),
            fancybox=True,
            shadow=True,
        )
        # 顯示圖形
        plt.tight_layout()
        plt.show()

3. 繪制效果

封裝好函數(shù)之后,繪制起來就很簡單了。

#根據(jù)示例數(shù)據(jù)設(shè)置變量
title = "學(xué)生各科成績"
x_labels = ["學(xué)生A", "學(xué)生B", "學(xué)生C", "學(xué)生D", "學(xué)生E"]
y_labels = ["語文", "數(shù)學(xué)", "英語", "物理", "化學(xué)"]
y_data = np.array(
    [
        [100, 120, 98, 88, 78],
        [105, 133, 109, 87, 89],
        [80, 112, 87, 90, 95],
        [90, 89, 76, 89, 88],
        [102, 60, 90, 66, 65],
    ]
)
y_mins = [0, 0, 0, 0, 0]
y_maxs = [120, 150, 110, 90, 100]
#繪制
pc = ParallelCoord(title, x_labels, y_labels, y_data, y_mins, y_maxs)
pc.draw()

這里為了演示,只有5條數(shù)據(jù)。

從平行坐標(biāo)系的圖中,可以看出,大部分物理都不錯(cuò),黃色的學(xué)生E,數(shù)學(xué)偏科比較嚴(yán)重。

有興趣的朋友,可以把手頭的數(shù)據(jù)導(dǎo)入這個(gè)封裝好的平行坐標(biāo)系類中,看看能否從數(shù)據(jù)中發(fā)現(xiàn)新的東西。

到此這篇關(guān)于使用Matplotlib繪制平行坐標(biāo)系的示例詳解的文章就介紹到這了,更多相關(guān)Matplotlib繪制平行坐標(biāo)系內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python內(nèi)置函數(shù)dir詳解

    Python內(nèi)置函數(shù)dir詳解

    這篇文章主要介紹了Python內(nèi)置函數(shù)dir詳解,本文講解了命令介紹、使用實(shí)例、使用dir查找module下的所有類、如何找到當(dāng)前模塊下的類等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • python向xls寫入數(shù)據(jù)(包括合并,邊框,對(duì)齊,列寬)

    python向xls寫入數(shù)據(jù)(包括合并,邊框,對(duì)齊,列寬)

    這篇文章主要介紹了python向xls寫入數(shù)據(jù)(包括合并,邊框,對(duì)齊,列寬),幫助大家更好的利用python處理表格,感興趣的朋友可以了解下
    2021-02-02
  • python如何獲得list或numpy數(shù)組中最大元素對(duì)應(yīng)的索引

    python如何獲得list或numpy數(shù)組中最大元素對(duì)應(yīng)的索引

    這篇文章主要介紹了python如何獲得list或numpy數(shù)組中最大元素對(duì)應(yīng)的索引,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python matplotlib庫繪制條形圖練習(xí)題

    python matplotlib庫繪制條形圖練習(xí)題

    這篇文章主要介紹了python matplotlib庫繪制條形圖練習(xí)題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python 哨兵值模式(Sentinel Value Pattern)的具體使用

    Python 哨兵值模式(Sentinel Value Pattern)的具體使用

    本文主要介紹了Python 哨兵值模式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-05-05
  • 一個(gè)小示例告訴你Python語言的優(yōu)雅之處

    一個(gè)小示例告訴你Python語言的優(yōu)雅之處

    本篇中, 我們展示一下一段非常小的代碼, 這段代碼十分吸引我們, 因?yàn)樗褂檬謨?yōu)雅和直接的方式解決了一個(gè)常見的問題.
    2014-07-07
  • python3利用Dlib19.7實(shí)現(xiàn)人臉68個(gè)特征點(diǎn)標(biāo)定

    python3利用Dlib19.7實(shí)現(xiàn)人臉68個(gè)特征點(diǎn)標(biāo)定

    這篇文章主要為大家詳細(xì)介紹了python3利用Dlib19.7實(shí)現(xiàn)人臉68個(gè)特征點(diǎn)標(biāo)定,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Python中實(shí)現(xiàn)高效的列表過濾多種方法示例

    Python中實(shí)現(xiàn)高效的列表過濾多種方法示例

    這篇文章主要給大家介紹了關(guān)于Python中實(shí)現(xiàn)高效的列表過濾的多種方法,包括基礎(chǔ)的for循環(huán)、列表推導(dǎo)式、filter函數(shù)、itertools模塊,以及高級(jí)的pandas和numpy庫,我們還討論了生成器的使用,以及在實(shí)際場景中的應(yīng)用,需要的朋友可以參考下
    2024-12-12
  • 5款非常棒的Python工具

    5款非常棒的Python工具

    這篇文章主要為大家詳細(xì)介紹了5款非常棒的Python工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Flask模板引擎之Jinja2語法介紹

    Flask模板引擎之Jinja2語法介紹

    這篇文章主要介紹了Flask模板引擎之Jinja2語法介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評(píng)論

德昌县| 泾源县| 桂阳县| 峨眉山市| 铜鼓县| 基隆市| 建阳市| 江川县| 邛崃市| 夏河县| 秦安县| 合肥市| 离岛区| 察隅县| 和龙市| 大石桥市| 嘉义县| 祁阳县| 红安县| 犍为县| 四子王旗| 唐河县| 应城市| 苏尼特左旗| 新源县| 泾阳县| 娄底市| 类乌齐县| 突泉县| 德庆县| 开原市| 宜春市| 郎溪县| 遵义市| 禄丰县| 四子王旗| 兰州市| 宿松县| 平阳县| 涿鹿县| 江永县|