0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用python對(duì)生成的map圖進(jìn)行上色呢?

sanyue7758 ? 來源:Tom聊芯片智造 ? 2023-09-26 09:32 ? 次閱讀

前幾期,有朋友讓我用python將cp的測(cè)試數(shù)據(jù)轉(zhuǎn)化為map

但是,他又想把特定的測(cè)量數(shù)據(jù)轉(zhuǎn)化為map圖后,進(jìn)行上色,即不同的測(cè)試數(shù)據(jù)能夠呈現(xiàn)不同的顏色,以便于直觀的觀察其趨勢(shì)。

數(shù)據(jù)樣式:

bc7a372c-5bba-11ee-939d-92fbcf53809c.png

左邊列是序號(hào),中間列是XY,X-0016Y0079表示的是(X,Y)坐標(biāo)為(16,79),最右行是測(cè)試數(shù)據(jù)。序號(hào)最大值為13278,即這個(gè)wafer有13278粒完成測(cè)試,得到了cp的測(cè)試數(shù)據(jù)。

我的思路:

1,將現(xiàn)有數(shù)據(jù)按照坐標(biāo),轉(zhuǎn)化為map圖,并將測(cè)試數(shù)值一一對(duì)應(yīng)填入map圖中。

2,有時(shí)測(cè)試標(biāo)準(zhǔn)是不一樣的,所以可以手動(dòng)設(shè)置標(biāo)準(zhǔn)值,這個(gè)在運(yùn)行程序時(shí)能夠彈出對(duì)話框,讓使用者能夠隨意更改標(biāo)準(zhǔn)。低于標(biāo)準(zhǔn)值的測(cè)量值單元格呈現(xiàn)淺紅色到紅色的漸變,高于標(biāo)準(zhǔn)值的測(cè)量值呈現(xiàn)淺綠到紫色的漸變。

做出的效果:

1,雙擊“map上色.exe”運(yùn)行程序

2,選擇要上色的測(cè)試數(shù)據(jù)文件

bc7f807e-5bba-11ee-939d-92fbcf53809c.png

3,手動(dòng)設(shè)置標(biāo)準(zhǔn)值

bc98c9da-5bba-11ee-939d-92fbcf53809c.png

4,設(shè)置文件名

bca11874-5bba-11ee-939d-92fbcf53809c.png

5,在原文件地址下輸出包含map圖的文件

bcb65284-5bba-11ee-939d-92fbcf53809c.png

6,打開文件

bcbc40ea-5bba-11ee-939d-92fbcf53809c.png

這樣就很直觀地看出測(cè)量值的分布圖來了。

原代碼如下,歡迎參考:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import PatternFill
from tkinter.simpledialog import askfloat
from tkinter import Tk
from tkinter import filedialog
import colorsys
from tkinter.simpledialog import askstring
def get_threshold(threshold_type):
    print(f"Getting threshold for {threshold_type}...")
    root = Tk()
    root.withdraw()

    if threshold_type == "IL":
        threshold = askfloat(f"Input {threshold_type} Threshold", f"Enter the {threshold_type} threshold:")
        return threshold
    elif threshold_type == "FC":
        threshold_range_str = askstring(f"Input {threshold_type} Threshold Range",
                                        f"Enter the {threshold_type} threshold range (e.g., 'min,max'):")
        print(f"User input for FC threshold: {threshold_range_str}")
        try:
            min_threshold, max_threshold = map(float, threshold_range_str.split(','))
            return min_threshold, max_threshold
        except ValueError:
            print("Invalid input. Please enter two numbers separated by a comma.")
            return None
    root.destroy()
def color_map(value, threshold, data_min, data_max):
    # 正常化值到 [threshold, data_max] 區(qū)間,從極淡綠(144,238,144)到紫(128,0,128)
    if threshold <= value <= data_max:
        normed_value = (value - threshold) / (data_max - threshold)
        r = int(144 * (1 - normed_value) + 128 * normed_value)
        g = int(238 * (1 - normed_value) + 0 * normed_value)
        b = int(144 * (1 - normed_value) + 128 * normed_value)

    # 正常化值到 [data_min, threshold] 區(qū)間,從紅(255,0,0)到黃(255,255,0)
    elif -10 <= value < threshold:
        normed_value = (value + 10) / (threshold + 10)  # 正則化到 [0, 1] 區(qū)間
        r = int(222 + (241 - 222) * normed_value)  # 從 222 漸變到 241
        g = int(28 + (147 - 28) * normed_value)  # 從 28 漸變到 147
        b = int(49 + (156 - 49) * normed_value)  # 從 49 漸變到 156

    elif data_min <= value < -10:
        r, g, b = 139, 0, 0

    else:
        r, g, b = 255, 255, 255  # 默認(rèn)為白色

    hex_color = 'FF' + '{:02X}{:02X}{:02X}'.format(r, g, b)
    return hex_color


def fc_color_map(value, min_threshold, max_threshold, data_min, data_max):
    if min_threshold <= value <= max_threshold:
       
        normed_value = (value - min_threshold) / (max_threshold - min_threshold)

        hue = normed_value * 360

        r, g, b = colorsys.hsv_to_rgb(hue / 360.0, 1, 1)  # Here saturation and value are both set to 1
        r, g, b = int(r * 255), int(g * 255), int(b * 255)

        hex_color = 'FF' + '{:02X}{:02X}{:02X}'.format(r, g, b)

    # For values outside the specified range
    elif value > max_threshold or value < min_threshold:
        r, g, b = 139, 0, 0
        hex_color = 'FF' + '{:02X}{:02X}{:02X}'.format(r, g, b)
    else:
        r, g, b = 255, 255, 255  # default to white
        hex_color = 'FF' + '{:02X}{:02X}{:02X}'.format(r, g, b)
    return hex_color
def save_to_excel(df, threshold, output_path, color_function):
    wb = Workbook()
    ws = wb.active

    data_min = df.min().min()  # 獲取整個(gè) dataframe 中的最小值
    data_max = df.max().max()  # 獲取整個(gè) dataframe 中的最大值

    for i in range(df.shape[0]):
        for j in range(df.shape[1]):
            value = df.iloc[i, j]
            if not pd.isna(value):
                cell = ws.cell(row=i + 2, column=j + 2)
                cell.value = value
                # 選擇正確的顏色映射函數(shù)和參數(shù)
                if color_function == color_map:
                    fill_color = color_function(value, threshold, data_min, data_max)
                elif color_function == fc_color_map:
                    min_threshold, max_threshold = threshold  # 從元組中解包
                    fill_color = color_function(value, min_threshold, max_threshold, data_min, data_max)

                cell.fill = PatternFill(start_color=fill_color,
                                        end_color=fill_color,
                                        fill_type="solid")
    wb.save(output_path)

def rgb_to_hex(rgb):
    return '{:02X}{:02X}{:02X}'.format(rgb[0], rgb[1], rgb[2])


def main():
    print("Starting main function...")
    input_file = filedialog.askopenfilename(title="Select the CSV file")
    print(f"Selected file: {input_file}")
    if "il" in input_file.lower():
        threshold_type = "IL"
        color_function = color_map
        threshold = get_threshold(threshold_type)
    else:
        threshold_type = "FC"
        color_function = fc_color_map
        threshold = get_threshold(threshold_type)
????if threshold is None:
        print("Invalid threshold. Exiting program.")
        return

    output_file = filedialog.asksaveasfilename(title="Save the visualization as", defaultextension=".xlsx",
                                               filetypes=[("Excel files", "*.xlsx")])
    print(f"Output file: {output_file}")

    df = pd.read_csv(input_file)
    save_to_excel(df, threshold, output_file, color_function)

if __name__ == "__main__":

main()






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4767

    瀏覽量

    84376

原文標(biāo)題:用python對(duì)生成的map圖上色

文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    何用強(qiáng)度生成這樣的云圖!

    何用強(qiáng)度生成這樣的云圖!
    發(fā)表于 07-27 13:29

    請(qǐng)教各位大神如何用matlab畫電機(jī)map???

    請(qǐng)教各位大神如何用matlab畫電機(jī)map???小弟感激不盡。。。。。
    發(fā)表于 04-11 15:50

    python調(diào)用labview生成的dll

    何用python調(diào)用labview生成的dll
    發(fā)表于 02-03 15:59

    何用Proteus ISIS軟件進(jìn)行原理設(shè)計(jì)及仿真

    Proteus ISIS軟件具有哪些功能?如何用Proteus ISIS軟件進(jìn)行原理設(shè)計(jì)及仿真?有哪些流程?
    發(fā)表于 11-10 06:34

    如何讓Keil生成map文件

    一、要讓Keil生成map文件,要設(shè)置:再重新編譯,沒有錯(cuò)誤后,就會(huì)生成map文件了。二、map文件中相關(guān)概念:段(section) :描述
    發(fā)表于 11-23 06:54

    何用樹莓派和Python去實(shí)現(xiàn)nRF24L01模塊功能

    何用樹莓派和Python去實(shí)現(xiàn)nRF24L01模塊功能?其相關(guān)代碼該如何去實(shí)現(xiàn)
    發(fā)表于 12-16 07:47

    請(qǐng)問arm必須要對(duì)生成的匯編指令進(jìn)行優(yōu)化嗎

    請(qǐng)問在用arm neon指令優(yōu)化程序時(shí),在一個(gè)for循環(huán)下,分別用int32x2_t和int32x4_t類型的指令,后者的速度并沒有按照理論上的速度更快,反而比前者慢是怎么回事?必須要對(duì)生成的匯編指令進(jìn)行優(yōu)化嗎?謝謝指教。
    發(fā)表于 09-01 15:47

    請(qǐng)問arm必須要對(duì)生成的匯編指令進(jìn)行優(yōu)化嗎

    請(qǐng)問在用ARM neon指令優(yōu)化程序時(shí),在一個(gè)for循環(huán)下,分別用int32x2_t和int32x4_t類型的指令,后者的速度并沒有按照理論上的速度更快,反而比前者慢是怎么回事?必須要對(duì)生成的匯編指令進(jìn)行優(yōu)化嗎?
    發(fā)表于 10-18 11:23

    最好的輔助數(shù)據(jù),MAP對(duì)調(diào)速電機(jī)有什么作用?

    電機(jī)中的MAP是電機(jī)測(cè)試時(shí)生成的一種數(shù)據(jù)曲線圖,主要是反映在不同轉(zhuǎn)速、扭矩下的電機(jī)效率分布情況,通俗而言就是效率分布,類似于我們地理課上常見的等高線圖。 在說調(diào)速電機(jī)之前,我們先了
    發(fā)表于 11-04 19:02 ?2570次閱讀
    最好的輔助數(shù)據(jù),<b class='flag-5'>MAP</b><b class='flag-5'>圖</b>對(duì)調(diào)速電機(jī)有什么作用?

    詳解如何用AD生成Gerber文件

    詳解如何用AD生成Gerber文件
    發(fā)表于 11-23 11:07 ?0次下載

    STM32的hex文件和map文件如何生成

    的對(duì)話框中選擇“Output”選項(xiàng)卡,然后勾選“Create HEX file”3、 生成map文件:選擇“Listing”選項(xiàng)卡,勾選“Linker Listing: .\Listings\xxxxxxx.map”,并全選其下
    發(fā)表于 12-27 18:36 ?5次下載
    STM32的hex文件和<b class='flag-5'>map</b>文件如何<b class='flag-5'>生成</b>

    python生成器是什么

    python生成器 1. 什么是生成器? 生成器(英文名 Generator ),是一個(gè)可以像迭代器那樣使用for循環(huán)來獲取元素的函數(shù)。 生成
    的頭像 發(fā)表于 02-24 15:53 ?3599次閱讀

    Python怎么批量生成PDF文檔

    這種模板套用的場(chǎng)景下,使用Python進(jìn)行自動(dòng)化就尤為方便,用最短的時(shí)間辦最高效的事。 今天就給大家講講如何用Python自動(dòng)套用模板批量生成
    的頭像 發(fā)表于 02-28 10:11 ?1080次閱讀
    <b class='flag-5'>Python</b>怎么批量<b class='flag-5'>生成</b>PDF文檔

    何用Python自動(dòng)套用模板批量生成PDF文檔

    今天就給大家講講如何用Python自動(dòng)套用模板批量生成的PDF文檔。 1.準(zhǔn)備 開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上噢,如果沒有,請(qǐng)?jiān)L問這篇文章: 超詳細(xì)
    的頭像 發(fā)表于 10-17 10:54 ?911次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>自動(dòng)套用模板批量<b class='flag-5'>生成</b>PDF文檔

    何用Python自動(dòng)套用模板批量生成PDF文檔

    辦最高效的事。 今天就給大家講講如何用Python自動(dòng)套用模板批量生成下方這樣的PDF文檔。 1.準(zhǔn)備 開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上噢,如果沒有,請(qǐng)?jiān)L問這
    的頭像 發(fā)表于 10-31 10:56 ?1437次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>自動(dòng)套用模板批量<b class='flag-5'>生成</b>PDF文檔