मैं एक 2D स्पेक्ट्रम प्लॉट करना चाहूंगा जहां x निर्देशांक वर्णक्रमीय आयाम (तरंग दैर्ध्य) है और y निर्देशांक pyqtgraph का उपयोग करके स्थानिक आयाम (आकाश के आर्कसेकंड में) है।

मैं ImageItem() का उपयोग करके ऐसा करने में सक्षम हूं लेकिन मुझे यह पता लगाना प्रतीत नहीं होता कि सही निर्देशांक में x और y अक्षों को कैसे प्रदर्शित किया जाए। मैं केवल लेबल या टिक नहीं बदलना चाहता बल्कि वास्तव में प्लॉट के निर्देशांक बदलना चाहता हूं क्योंकि मुझे बाद में इन मूल्यों (तरंग दैर्ध्य और आर्कसेक) का उपयोग करके संचालन करने की आवश्यकता है।

यहां एक न्यूनतम कामकाजी उदाहरण दिया गया है:

import pyqtgraph as pg
import numpy as np


# The fake data
wvlg = np.linspace(300, 600, 5000)
arcsec = np.linspace(-5, 5, 100)
flux = np.ones((wvlg.shape[0], arcsec.shape[0])) * np.exp(-(arcsec)**2/0.1)
flux += np.random.normal(0, 0.1, size=(wvlg.shape[0], arcsec.shape[0]))

# The plotting
win = pg.GraphicsLayoutWidget(show=True)
ax2D = win.addPlot(title='2D spectrum', row=0, col=0)
img = pg.ImageItem()
img.setImage(flux)
ax2D.addItem(img)
# Some line converting the x and y values to wvlg and arcsec

यह एक छवि देता है जहां एक्स और वाई अक्ष सूचकांक मूल्य दिखाते हैं, जबकि मैं संबंधित तरंगदैर्ध्य और आर्कसेक मान दिखाना चाहता हूं।

The 2D spectrum plotted but without the coordinates in the x and y axes

क्या ऐसा करने का कोई आसान तरीका है जिसे मैंने दस्तावेज़ीकरण में पूरी तरह से अनदेखा कर दिया है?

1
Jesse Rio 18 नवम्बर 2020, 19:10

1 उत्तर

सबसे बढ़िया उत्तर

आप डेटा की सीमा निर्धारित करने के लिए ImageItem वर्ग की setRect विधि का उपयोग कर सकते हैं। नीचे मेरा उदाहरण देखें।

ध्यान दें कि मैंने छवि को आधा पिक्सेल से स्थानांतरित कर दिया है ताकि पिक्सेल केंद्र सटीक निर्देशांक से मेल खा सकें। अन्यथा निर्देशांक पिक्सेल के कोने बिंदुओं में से एक के साथ संरेखित होंगे।

import pyqtgraph as pg
import numpy as np

from PyQt5 import QtCore, QtWidgets


def main():
    app = QtWidgets.QApplication([])
    
    # The fake data
    wvlg = np.linspace(300, 600, 5000)
    arcsec = np.linspace(-5, 5, 100)
    flux = np.ones((wvlg.shape[0], arcsec.shape[0])) * np.exp(-(arcsec)**2/0.1)
    flux += np.random.normal(0, 0.1, size=(wvlg.shape[0], arcsec.shape[0]))

    # The plotting
    win = pg.GraphicsLayoutWidget()
    ax2D = win.addPlot(title='2D spectrum', row=0, col=0)
    img = pg.ImageItem()
    img.setImage(flux)
    ax2D.addItem(img)
    
    print(flux.shape)

    # Move the image by half a pixel so that the center of the pixels are
    # located at the coordinate values
    dx = wvlg[1]-wvlg[0]
    dy = arcsec[1]-arcsec[0]
    print("pixel size x: {}, pixel size y: {}".format(dx, dy))
    
    rect = QtCore.QRectF(wvlg[0] - dx/2, arcsec[0] - dy/2, 
                         wvlg[-1] - wvlg[0], arcsec[-1] - arcsec[0])
    print(rect)
    img.setRect(rect)

    ax2D.setLabels(left='arcsec', bottom='wvlg')
    
    win.show()
    win.raise_()
    app.exec_()
    
if __name__ == "__main__":
    main()
2
titusjan 19 नवम्बर 2020, 14:52