PythonでExcelのデータからRGB・HSV色情報の3D散布図を作成

※このサイトの記事内では広告を掲載している場合があります。

こんにちわ!

今回は、Excelのデータから3D散布図を作成する方法を記述しました。

Excelには、たくさんのデータが保存されており、そのデータをプログラムで処理をすることで散布図を作成していきます。最終的な出力は次のようになっています。

少し難しいけど頑張ろう!

実行環境
C:\...>Python --version
Python 3.5.2 :: Anaconda 4.2.0 (64-bit)

※Anacondaは特に必要ないです。

無料オンライン相談を活用しよう!

Pythonというプログラミング言語は機械学習の人気の高まりなどもあり、様々なスクールが無料説明会を開催しています。

その中でも「Freeks(フリークス)|業界初!10,780円のサブスク型プログラミングスクール」がオススメです。Pythonを効率よく学びたいという方はまずは適性を知るためにも無料説明会を利用しましょう。

無料説明会を参加してみる!

この記事の主旨

今回の目的は、上の海外の手紙の色情報を分析することです。

分析といっても、画像には「文字」と「ハンコ(赤文字)」と「背景」の3つのクラスがあります。これらのRGBとHSVの値を抽出し、その特徴を視覚的にわかりやすいグラフで表現するのが今回の目標です。

RGB、HSVの詳細や、色情報をExcelに出力する手法は前回の記事で行いました。

この手法を用いて3D散布図を作成していきます。

Excelデータの内容

Excelには300行×6列のデータが格納されています。

この値は、上記の画像上のある画素に対しての色情報がまとめられています。

データの意味は以下のようになっています。

  • 2~ 101行目 :文字データ
  • 102 ~ 201行目:背景
  • 202 ~ 301行目:ハンコ(赤文字)

このように、データがプログラムを組みやすいように調整されています。
下のExcelファイルは上の画像の様にデータが保存されてます。
マクロ機能などはないので安心してください笑

使用するデータ

実際にプログラムを見ていこう!

3D散布図作成のサンプルコード

関数「install_Excel」


# Excelデータの読み取り関数
def install_excel():
    # 300 * 3のnumpy配列の準備
    values = np.zeros((num, 3))
    wb = openpyxl.load_workbook(Excel_name)
    # シート名の設定
    sheet = wb["Sheet1"]   
    temp = []

    if pattern == "RGB":
        for row in sheet:
            # RGBデータはExcelの1~3列目
            temp.append([col.value for col in row[1 : 4]])

    if pattern == "HSV":
        for row in sheet:
            # HSVデータはExcelの4~6列目
            temp.append([col.value for col in row[4 : 7]])       
    
    for i in range(len(temp) - 1):
        # tempの1行目は見出しがある
        values[i] = temp[i + 1]

    return values

「num」や「Excel_name」などの変数や、必要なモジュールは、メイン関数の部分で設定しています。

関数「draw_graph」


def draw_graph():
    # グラフの枠を作成
    fig = plt.figure()
    ax = Axes3D(fig)
    # 色の設定
    colors = ["m", "g", "c"]
    # ラベル名の設定
    words = ["word", "background", "stamp"]

    # 3D散布図でプロットするデータを分別
    for k in range(3):
        # 0~99行目に文字データ、100~199行目に背景データ、200~299行目にハンコデータ
        X = [values[i][0] for i in range(100 * k , 100 * (k + 1))]# "R" or "H"
        Y = [values[i][1] for i in range(100 * k , 100 * (k + 1))]# "G" or "S"
        Z = [values[i][2] for i in range(100 * k , 100 * (k + 1))]# "B" or "V"

        # データ、色、ラベルを設定。キーワード引数による考え方
        ax.scatter(X, Y, Z, color = colors[k], label = words[k])
        
    # X,Y,Z軸にラベルを設定
    ax.set_xlabel(pattern[0])
    ax.set_ylabel(pattern[1])
    ax.set_zlabel(pattern[2])
    ax.legend()
    # .plotで描画
    ax.plot(X, Y, Z, marker="o", linestyle= 'None')

    # 最後に.show()を書いてグラフ表示
    plt.show()

3D散布図でプロットする部分では、データの行数が0 ~ 99と変わっていると思われるかもしれませんが、最初の「install_Excel」関数で、見出しなどの不必要なデータを除いているのでこのようになっています。

配列「pattern」も、メイン関数のほうで定義しています。

メイン関数


import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import openpyxl

#Excelのファイル名
Excel_name = 'RGB_HSV.xlsx'

# (100行 * 3種)のデータ
num = 300

# "RGB" or "HSV"を設定
pattern = "RGB"

if __name__ == "__main__":
    values = install_excel()
    draw_graph()

必要なモジュールは全部で4つです。

よく使う「numpy」と、グラフ作成に必要な「matploylib」、3D作成のための「Axes3D」、Excelを読み込むための「openpyxl」です。

全体のコード


def install_excel():
    values = np.zeros((num, 3))
    wb = openpyxl.load_workbook(Excel_name)
    sheet = wb["Sheet1"]   
    temp = []

    if pattern == "RGB":
        for row in sheet:
            temp.append([col.value for col in row[1 : 4]])

    if pattern == "HSV":
        for row in sheet:
            temp.append([col.value for col in row[4 : 7]])       
    
    for i in range(len(temp) - 1):
        values[i] = temp[i + 1]

    return values


def draw_graph():
    fig = plt.figure()
    ax = Axes3D(fig)
    colors = ["m", "g", "c"]
    words = ["word", "background", "stamp"]

    for k in range(3):
        X = [values[i][0] for i in range(100 * k , 100 * (k + 1))]
        Y = [values[i][1] for i in range(100 * k , 100 * (k + 1))]
        Z = [values[i][2] for i in range(100 * k , 100 * (k + 1))]

        ax.scatter(X, Y, Z, color = colors[k], label = words[k])
        
    ax.set_xlabel(pattern[0])
    ax.set_ylabel(pattern[1])
    ax.set_zlabel(pattern[2])
    ax.legend()
    ax.plot(X, Y, Z, marker="o", linestyle= 'None')

    plt.show()


import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import openpyxl

Excel_name = 'RGB_HSV.xlsx'
num = 300
pattern = "RGB"

if __name__ == "__main__":
    values = install_excel()
    draw_graph()

出力結果

お待ちかねの結果ですね!結構きれいに仕上がってますよ!

RGB色空間の3D散布図

HSV色空間の3D散布図

RGBとHSV色空間で特徴が違うね!

まとめ

今回は、海外の手紙の「文字」「ハンコ(赤文字)」「背景」の3つのクラスのRGB、HSVの色空間の特徴を3D散布図を用いて特徴を調べてみました。

予想通りにそれぞれのクラスで特徴が認められました。

今回の手法を用いて、Excelからグラフを作成する方法を理解していただければ嬉しいと思います。

無料の説明会を有効活用しよう!

独学での学習は孤独感を感じやすく挫折してしまう初心者も多いです。また、参考書を購入しても全く読む気にならないという方も多いはずです。

それでも、なんとかPythonの勉強を行い、高スキルなエンジニアを目指したいという方は無料で受けられるオンライン説明会に参加してみることも一つの手です。

Pythonというプログラミング言語は機械学習の人気の高まりなどもあり、様々なスクールが無料説明会を開催しています。

その中でも「Freeks(フリークス)|業界初!10,780円のサブスク型プログラミングスクール」がオススメです。Pythonを効率よく学びたいという方はまずは適性を知るためにも無料説明会を利用しましょう。

無料説明会を参加してみる!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA