2025, Oct 17 21:31

Matplotlib में 1D NumPy array प्लॉट करते समय x–y लंबाई त्रुटि का समाधान

Matplotlib में 1D NumPy array प्लॉट करते समय x और y की असमान लंबाई से होने वाली ValueError को समझें और ठीक करें: सही x इंडेक्स, np.arange व xticks सेटअप के तरीके।

Matplotlib के साथ 1D NumPy array प्लॉट करते समय एक आम गलती x और y के लिए अलग-अलग लंबाई वाले arrays देना है। अगर दोनों मेल नहीं खाते, तो Matplotlib साफ-साफ exception फेंकता है: x और y का पहला dimension समान होना चाहिए। नीचे एक छोटा, वास्तविक परिदृश्य दिया है जो इसी त्रुटि तक ले जाता है, और इसे ठीक करने का सीधा तरीका भी।

समस्या की रूपरेखा

डेटासेट में 3 मिनट तक 10 Hz पर इकट्ठे किए गए 1800 ADC सैंपल हैं। उद्देश्य है: फ़ाइल से मान पढ़ना, 1D NumPy array बनाना और उसे विज़ुअलाइज़ करना।

import matplotlib.pyplot as plt
import numpy as np
series = np.array
log_path = "MyValues.log"  # अपने वास्तविक पथ से बदलें
samp_rate = 10
span_sec  = 180.0            # सेकंड
sample_total = int(span_sec * samp_rate)  # अपेक्षित सैंपल की संख्या
try:
    with open(log_path, 'r') as fh:
        for row in fh:
            series = np.append(series, int(row.strip()))
except FileNotFoundError:
    print(f"Error: The file '{log_path}' was not found.")
except Exception as exc:
    print(f"An error occurred: {exc}")
print(len(series))
plt.figure(figsize=(10, 6))
plt.plot(sample_total, series, marker='o', linestyle='-', color='purple')
plt.title('Plot of 1D Array Data')
plt.xlabel('Index')
plt.ylabel('Value')
plt.grid(True)
plt.xticks(sample_total)
plt.show()

समस्या कहाँ है

प्लॉटिंग कॉल x-अक्ष के लिए एक स्केलर और y-अक्ष के लिए एक वेक्टर दे रहा है। Matplotlib उम्मीद करता है कि x और y दोनों समान लंबाई की क्रमिकाएँ हों—या फिर सिर्फ y दें ताकि इंडेक्स अपने‑आप बन जाएँ। यहाँ sample_total = 1800 है, जो केवल एक संख्या है, इंडेक्स का array नहीं। यही गलती xticks कॉल में भी है: टिक पोज़िशन की सूची की जगह एक अकेला integer पास किया गया है।

यानी y में कई बिंदु हैं, लेकिन x में सिर्फ एक मान। यही असंगति ValueError को जन्म देती है।

समाधान: x के लिए मेल खाता इंडेक्स बनाएं

ऐसी x-अक्ष की अनुक्रमिका बनाइए जो आपके डेटा की लंबाई से मेल खाए। अगर इंडेक्स-आधारित प्लॉट चाहिए, तो array की लंबाई पर np.arange का उपयोग करें। साथ ही, पहले फ़ाइल को संख्यात्मक वेक्टर में पढ़ें, फिर प्लॉट करें।

import matplotlib.pyplot as plt
import numpy as np
log_path = "MyValues.log"
samp_rate = 10
span_sec = 180.0
sample_total = int(span_sec * samp_rate)
try:
    with open(log_path, "r") as fh:
        readings = [int(row.strip()) for row in fh]
    data_vec = np.array(readings)
    # अपेक्षित सैंपल संख्या के विरुद्ध वैकल्पिक जाँच
    if len(data_vec) != sample_total:
        print(f"Expected {sample_total}, but got {len(data_vec)}")
    x_index = np.arange(len(data_vec))
    plt.figure(figsize=(10, 6))
    plt.plot(x_index, data_vec, marker='o', linestyle='-', color='purple')
    plt.title('Plot of 1D Array Data')
    plt.xlabel('Index')
    plt.ylabel('Value')
    plt.grid(True)
    plt.xticks(x_index)
    plt.show()
except FileNotFoundError:
    print(f"Error: The file '{log_path}' not exist.")
except Exception as err:
    print(f"error occurred: {err}")

यह क्यों मायने रखता है

टाइम सीरीज़ और सिग्नल प्रोसेसिंग के कामों में—जैसे फ़िल्टर डिज़ाइन से पहले कच्चे ADC मान देखना—प्लॉटिंग अक्सर पहली जाँच होती है। अगर x-अक्ष डेटा से मेल नहीं खाता, तो रुझान गलत पढ़े जा सकते हैं, या बदतर, प्लॉट बन ही नहीं पाएगा। x और y के आयाम बराबर रखने से बारीक डिबगिंग भटकाव से बचते हैं और आगे के चरण—जैसे फ़िल्टर प्रोटोटाइपिंग—काफी भरोसेमंद बनते हैं। यह धारणाओं की पुष्टि में भी मदद करता है: अपेक्षित सैंपल संख्या को लोड हुए डेटा से मिलाना स्रोत में गायब या अतिरिक्त पंक्तियों को तुरंत पकड़ लेता है।

मुख्य बातें

जब आप निहित इंडेक्सिंग पर निर्भर नहीं हैं, तो Matplotlib को हमेशा सही x वेक्टर दीजिए। इंडेक्स-आधारित प्लॉट के लिए डेटा की लंबाई पर np.arange पर्याप्त है। यदि सैंपलिंग दर और अवधि ज्ञात है, तो विज़ुअल विश्लेषण और फ़िल्टर डिज़ाइन से पहले लोड किए गए डेटा के साथ अपेक्षित सैंपल गिनती का मिलान करें—इसी से अखंडता सुनिश्चित होगी। इन छोटे गार्डरेल्स के साथ प्लॉटिंग पूर्वानुमेय हो जाती है और आपका सिग्नल प्रोसेसिंग वर्कफ़्लो पटरी पर रहता है।

यह लेख StackOverflow पर एक प्रश्न (द्वारा: Nimit Vachhani) और Ranger के उत्तर पर आधारित है।