2013-04-24 7 views
11

मेरे पास एक समन्वय परिवर्तन का 2 डी मानचित्र है। प्रत्येक बिंदु पर डेटा मूल समन्वय प्रणाली में अक्षीय कोण है, जो 0 से 360 तक जाता है। मैं निरंतर कोण की साजिश रेखाओं के लिए pyplot.contour का उपयोग करने की कोशिश कर रहा हूं, उदा। 45 डिग्री दो ध्रुवों के बीच 45 डिग्री रेखा के साथ समोच्च दिखाई देता है, लेकिन समोच्च के लिए एक अतिरिक्त हिस्सा होता है जो 0/360 विघटन के साथ दो ध्रुवों को जोड़ता है। यह एक बहुत ही बदसूरत बदसूरत रेखा बनाता है क्योंकि यह मूल रूप से पिक्सेल को एक तरफ 0 के करीब एक नंबर के साथ और दूसरी तरफ 360 के करीब है।एक बंदरगाह के साथ एक समोच्च ड्राइंग से pyplot.contour रोकें

उदाहरण: colour map with discontinuity

आप बाईं ओर नीले/लाल वक्र साथ अलगाव देख सकते हैं: यहाँ एक छवि पूर्ण रंग नक्शे का उपयोग कर रहा है। एक तरफ 360 डिग्री है, दूसरा 0 डिग्री है। जब आकृति की साजिश रचने, मैं मिलता है:

contour plot with discontinuity

ध्यान दें कि सभी आकृति दो ध्रुवों कनेक्ट करते हैं, लेकिन फिर भी मैं 0 डिग्री समोच्च साजिश रची नहीं किया है, अन्य सभी आकृति (0 डिग्री अलगाव में आगे बढ़ने के वजह से pyplot सोचता है कि यह एक तरफ 0 है और दूसरी तरफ 360 है, तो इसमें अन्य सभी कोण होना चाहिए)।

import numpy as np 
import matplotlib.pyplot as plt 
jgal = np.array([[-0.054875539726,-0.873437108010,-0.483834985808],\ 
       [0.494109453312,-0.444829589425, 0.746982251810],\ 
       [-0.867666135858,-0.198076386122, 0.455983795705]]) 

def s2v3(rra, rdec, r): 
    pos0 = r * np.cos(rra) * np.cos(rdec) 
    pos1 = r * np.sin(rra) * np.cos(rdec) 
    pos2 = r * np.sin(rdec) 
    return np.array([pos0, pos1, pos2]) 

def v2s3(pos): 
    x = pos[0] 
    y = pos[1] 
    z = pos[2] 
    if np.isscalar(x): x, y, z = np.array([x]), np.array([y]), np.array([z]) 
    rra = np.arctan2(y, x) 
    low = np.where(rra < 0.0) 
    high = np.where(rra > 2.0 * np.pi) 
    if len(low[0]): rra[low] = rra[low] + (2.0*np.pi) 
    if len(high[0]): rra[high] = rra[high] - (2.0*np.pi) 
    rxy = np.sqrt(x**2 + y**2) 
    rdec = np.arctan2(z, rxy) 
    r = np.sqrt(x**2 + y**2 + z**2) 
    if x.size == 1: 
     rra = rra[0] 
     rdec = rdec[0] 
     r = r[0] 
    return rra, rdec, r 


def gal2fk5(gl, gb): 
    dgl = np.array(gl) 
    dgb = np.array(gb) 
    rgl = np.deg2rad(gl) 
    rgb = np.deg2rad(gb) 
    r = 1.0 
    pos = s2v3(rgl, rgb, r) 

    pos1 = np.dot(pos.transpose(), jgal).transpose() 

    rra, rdec, r = v2s3(pos1) 

    dra = np.rad2deg(rra) 
    ddec = np.rad2deg(rdec) 

    return dra, ddec 


def make_coords(resolution=50): 
    width=9 
    height=6 
    px = width*resolution 
    py = height*resolution 
    coords = np.zeros((px,py,4)) 
    for ix in range(0,px): 
     for iy in range(0,py): 
      l = 360.0/px*ix - 180.0 
      b = 180.0/py*iy - 90.0 
      dra, ddec = gal2fk5(l,b) 
      coords[ix,iy,0] = dra 
      coords[ix,iy,1] = ddec 
      coords[ix,iy,2] = l 
      coords[ix,iy,3] = b 
    return coords 

coords = make_coords() 

# now do one of these 
#plt.imshow(coords[:,:,0],origin='lower') # color plot 
#plt.contour(coords[:,:,0],levels=[45,90,135,180,225,270,315]) # contour plot with jagged ugliness 

मैं या तो कैसे कर सकते हैं::

  • मेकअप अलगाव के साथ एक समोच्च ड्राइंग से

    1. रोक pyplot.contour pyplot.contour पहचान

      कोड इस डेटा का उत्पादन करने के कि कोण में 0/360 असंतुलन वास्तविक असंतोष नहीं है।

    मैं सिर्फ अंतर्निहित डेटा के संकल्प को बढ़ा सकते हैं, लेकिन इससे पहले कि मैं एक अच्छा चिकनी लाइन प्राप्त यह एक बहुत लंबे समय और साजिश करने के लिए स्मृति का एक बहुत लेने के लिए शुरू होता है।

    मैं भी 0 डिग्री के साथ एक समोच्च प्लॉट करना चाहता हूं, लेकिन अगर मैं समझ सकता हूं कि असंतोष को कैसे छिपाना है, तो मैं इसे किसी अन्य जगह पर कहीं और स्थानांतरित नहीं कर सकता। या, अगर मैं # 2 कर सकता हूं, तो यह कोई मुद्दा नहीं होगा।

  • +2

    यह मदद करेगा यदि आप समस्या प्लॉट की छवि पोस्ट कर सकते हैं, या कुछ उदाहरण कोड (सरलीकृत) संस्करण उत्पन्न करने के लिए कोड कर सकते हैं। – askewchan

    +0

    मैंने समस्या को चित्रित करने के लिए उदाहरण प्लॉट्स को जोड़ा है – GJP

    +1

    यह समोच्चों का अजीब उपयोग है और मुझे नहीं लगता कि आप इसे जिस तरह से चाहते हैं उसे काम करने में सक्षम होने जा रहे हैं। हालांकि, मुझे विश्वास है कि आप उस साजिश को प्राप्त कर सकते हैं जिसे आप समोच्च के अलावा कुछ और उपयोग करना चाहते हैं। 'Imshow' का उपयोग करके आप अपनी शीर्ष साजिश की तरह कुछ देंगे और' स्ट्रीमप्लॉट 'आपको अपनी निचली साजिश के करीब कुछ देगा। आप किस चीज के अंत में चाहते हैं उसके करीब कौन सा साजिश है? क्या आप एक ऐसा फ़ंक्शन प्रदान कर सकते हैं जो डेटा फ़ील्ड उत्पन्न करता है ताकि हमारे पास कुछ खेलने के लिए कुछ हो? – Paul

    उत्तर

    1

    यह निश्चित रूप से अभी भी एक हैक है, लेकिन आप एक दो गुना दृष्टिकोण के साथ अच्छा चिकनी आकृति प्राप्त कर सकते हैं:

    चरण का निरपेक्ष मान की
    1. प्लॉट आकृति (जाने से -180˚ 180˚ करने के लिए) ताकि कोई असंतोष न हो।
    2. प्लॉट दो एक सीमित क्षेत्र में आकृति के सेट इतना है कि सबसे ऊपर और एक्सट्रीमा के नीचे के करीब संख्यात्मक दोष में रेंगना नहीं है

    यहाँ अपने उदाहरण से संलग्न करने के पूरा कोड है:।

    Z = np.exp(1j*np.pi*coords[:,:,0]/180.0) 
    Z *= np.exp(0.25j*np.pi/2.0) # Shift to get same contours as in your example 
    X = np.arange(300) 
    Y = np.arange(450) 
    
    N = 2 
    levels = 90*(0.5 + (np.arange(N) + 0.5)/N) 
    c1 = plt.contour(X, Y, abs(np.angle(Z)*180/np.pi), levels=levels) 
    c2 = plt.contour(X, Y, abs(np.angle(Z*np.exp(0.5j*np.pi))*180/np.pi), levels=levels) 
    

    Smooth contour plot of phase angle

    एक किसी भी "समय-समय पर" समारोह के लिए चिकनी आकृति प्राप्त करने के लिए इस कोड को सामान्यीकरण कर सकते हैं।क्या किया जाना बाकी है सही मान के साथ समोच्चों का एक नया सेट उत्पन्न करना है ताकि रंगमंच सही तरीके से लागू हो जाएं, लेबल सही ढंग से लागू किए जाएंगे। हालांकि, matplotlib के साथ ऐसा करने का एक आसान तरीका प्रतीत नहीं होता है: प्रासंगिक QuadContourSet कक्षा सबकुछ करता है और मुझे c1 और c2 समोच्चों से उचित समोच्च वस्तु का निर्माण करने का एक आसान तरीका नहीं दिखता है।

    संबंधित मुद्दे