मैं एक 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
यह एक छवि देता है जहां एक्स और वाई अक्ष सूचकांक मूल्य दिखाते हैं, जबकि मैं संबंधित तरंगदैर्ध्य और आर्कसेक मान दिखाना चाहता हूं।
क्या ऐसा करने का कोई आसान तरीका है जिसे मैंने दस्तावेज़ीकरण में पूरी तरह से अनदेखा कर दिया है?
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()
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।