2013-10-25 18 views
5

पर दूसरी धुरी जोड़ें I एक आंकड़े में दो ध्रुवीय भूखंडों को साजिश करने का प्रयास करें। (इस क्षेत्र के लिए कितने नमूना बिंदु)ध्रुवीय साजिश

fig = super(PlotWindPowerDensity, self).get_figure() 
    rect = [0.1, 0.1, 0.8, 0.8] 
    ax = WindSpeedDirectionAxes(fig, rect) 

    self.values_dict = collections.OrderedDict(sorted(self.values_dict.items())) 
    values = self.values_dict.items() 
    di, wpd = zip(*values) 
    wpd = np.array(wpd).astype(np.double) 
    wpdmask = np.isfinite(wpd) 
    theta = self.radar_factory(int(len(wpd))) 

    # spider plot 
    ax.plot(theta[wpdmask], wpd[wpdmask], color = 'b', alpha = 0.5) 
    ax.fill(theta[wpdmask], wpd[wpdmask], facecolor = 'b', alpha = 0.5) 

    # bar plot 
    ax.plot_bar(table=self.table, sectors=self.sectors, speedbins=self.wpdbins, option='wind_power_density', colorfn=get_sequential_colors) 

    fig.add_axes(ax) 
    return fig 

Result till now

बार की लंबाई डेटा बेस है: नीचे कोड देखें। सलाखों के रंग संवाददाता क्षेत्र (नीला: कम, लाल: उच्च) में कुछ मूल्य डिब्बे (उदाहरण के लिए 2.5-5 मीटर/सेक) की आवृत्ति दिखाते हैं। नीली मकड़ी साजिश प्रत्येक क्षेत्र के लिए औसत मूल्य दिखाती है।

दिखाए गए आंकड़े में, प्रत्येक साजिश के मान समान हैं, लेकिन यह दुर्लभ है। मुझे दूसरी प्लॉट को दूसरी धुरी को असाइन करने की आवश्यकता है और इस धुरी को दूसरी दिशा में दिखाएं।

संपादित करें:

जो की अच्छा जवाब के बाद, मैं आंकड़ा का परिणाम मिलता है। provisional result यह लगभग हर चीज है जिसे मैं प्राप्त करना चाहता था। लेकिन कुछ ऐसे मुद्दे हैं जिन्हें मैं समझने में सक्षम नहीं था।

  1. साजिश गतिशील रूप से डेटा बेस बदलने के लिए बनाई गई है। इसलिए मुझे मंडलियों के समान स्थान प्राप्त करने के लिए एक गतिशील तरीका चाहिए। अब तक मैं इसके साथ हल:

    start, end = ax2.get_ylim() 
    ax2.yaxis.set_ticks(np.arange(0, end, end/len(ax.yaxis.get_ticklocs()))) 
    

    का अर्थ है: दूसरा अक्ष के लिए मैं आदेश पहले अक्ष में से एक के लिए ticklocs फिट करने के लिए टिक बदल देते हैं। ज्यादातर मामलों में मुझे कुछ दशमलव स्थान मिलते हैं, लेकिन मुझे यह नहीं चाहिए, क्योंकि यह साजिश की स्पष्टता को दूषित करता है। क्या इस समस्या को और अधिक बुद्धिमानी से हल करने का कोई तरीका है?

  2. यॉटिक्स (रेडियल वन) 0 से अगले तक के अंतिम सर्कल तक है। मैं कैसे प्राप्त कर सकता हूं कि मान पहले सर्कल से लेकर आखिरी (सीमा) तक हैं? पहली धुरी के समान ही।

+0

कृपया अपने खरोज को ठीक। ऐसा लगता है कि आप कक्षाओं के एक बड़े पैमाने पर अनुकूलित सेट का उपयोग कर रहे हैं जो मुश्किल से चल रहा है यह हल कर देता है। क्या आप केवल मानक matplotlib ऑब्जेक्ट का उपयोग करके आप जो चाहते हैं उसका प्रदर्शन कर सकते हैं? – tacaswell

+0

छवि को शामिल करने के लिए धन्यवाद। मेरे पास यह करने के लिए बहुत कम प्रतिष्ठा स्कोर था। – fidelitas

+1

अंतिम त्रिज्या लेबल को प्रदर्शित करने के तरीके के बारे में आपके दूसरे प्रश्न के लिए, यह इसलिए है क्योंकि आप 'np.arange' का उपयोग करके टिक सेट कर रहे हैं। 'arange' _before_ endpoint रोकता है (उदा।' np.arange (0, 0.5, 0.1) 'उपज 'सरणी ([0.0, 0.1, 0.2, 0.3, 0.4])')। यदि आप एंडपॉइंट शामिल करना चाहते हैं, तो इसके बजाय 'end + dx' (जहां' dx' आपका अंतराल है) का उपयोग करें। –

उत्तर

6

इसलिए, जैसा कि मैं इसे समझता हूं, आप उसी ध्रुवीय साजिश पर बहुत अलग परिमाण के साथ डेटा प्रदर्शित करना चाहते हैं। मूल रूप से आप पूछ रहे हैं कि ध्रुवीय अक्ष के लिए twinx के समान कुछ कैसे करें।

एक उदाहरण के रूप समस्या को वर्णन करने के लिए, यह नीले रंग की श्रृंखला से एक अलग पैमाने पर नीचे भूखंड पर हरे रंग की श्रृंखला प्रदर्शित करने के लिए अच्छा होगा, जबकि उन्हें आसान तुलना .:

के लिए एक ही ध्रुवीय अक्ष पर रखने
import numpy as np 
import matplotlib.pyplot as plt 

numpoints = 30 
theta = np.linspace(0, 2*np.pi, numpoints) 
r1 = np.random.random(numpoints) 
r2 = 5 * np.random.random(numpoints) 

params = dict(projection='polar', theta_direction=-1, theta_offset=np.pi/2) 
fig, ax = plt.subplots(subplot_kw=params) 

ax.fill_between(theta, r2, color='blue', alpha=0.5) 
ax.fill_between(theta, r1, color='green', alpha=0.5) 

plt.show() 

enter image description here

हालांकि, ax.twinx() ध्रुवीय भूखंडों के लिए काम नहीं करता।

इसके आसपास काम करना संभव है, लेकिन यह बहुत सीधी नहीं है। यहाँ एक उदाहरण है:

import numpy as np 
import matplotlib.pyplot as plt 

def main(): 
    numpoints = 30 
    theta = np.linspace(0, 2*np.pi, numpoints) 
    r1 = np.random.random(numpoints) 
    r2 = 5 * np.random.random(numpoints) 

    params = dict(projection='polar', theta_direction=-1, theta_offset=np.pi/2) 
    fig, ax = plt.subplots(subplot_kw=params) 
    ax2 = polar_twin(ax) 

    ax.fill_between(theta, r2, color='blue', alpha=0.5) 
    ax2.fill_between(theta, r1, color='green', alpha=0.5) 
    plt.show() 

def polar_twin(ax): 
    ax2 = ax.figure.add_axes(ax.get_position(), projection='polar', 
          label='twin', frameon=False, 
          theta_direction=ax.get_theta_direction(), 
          theta_offset=ax.get_theta_offset()) 
    ax2.xaxis.set_visible(False) 
    # There should be a method for this, but there isn't... Pull request? 
    ax2._r_label_position._t = (22.5 + 180, 0.0) 
    ax2._r_label_position.invalidate() 
    # Ensure that original axes tick labels are on top of plots in twinned axes 
    for label in ax.get_yticklabels(): 
     ax.figure.texts.append(label) 
    return ax2 

main() 

enter image description here

है कि हम क्या चाहते हैं, लेकिन यह पहली बार में काफी बुरा लग रहा है।एक सुधार है कि हम क्या कर रहे हैं की साजिश रचने के अनुरूप करने के लिए टिक लेबल के लिए होगा:

plt.setp(ax2.get_yticklabels(), color='darkgreen') 
plt.setp(ax.get_yticklabels(), color='darkblue') 

enter image description here

हालांकि, हम अभी भी डबल-ग्रिड, जो बल्कि भ्रामक हैं। इसके चारों ओर एक आसान तरीका मैन्युअल रूप से आर-सीमा (और/या आर-टिक) सेट करना है जैसे कि ग्रिड एक दूसरे के शीर्ष पर गिर जाएंगे। वैकल्पिक रूप से, आप इसे स्वचालित रूप से करने के लिए एक कस्टम लोकेटर लिख सकते हैं। यहाँ सरल दृष्टिकोण के साथ छड़ी करते हैं:

ax.set_rlim([0, 5]) 
ax2.set_rlim([0, 1]) 

enter image description here

चेतावनी: क्योंकि साझा कुल्हाड़ियों ध्रुवीय भूखंडों के लिए काम नहीं करते, implmentation मैं ऊपर है कुछ भी है कि की स्थिति में परिवर्तन के साथ समस्याओं होगा मूल अक्ष उदाहरण के लिए, आकृति में एक कलरबार जोड़ना सभी प्रकार की समस्याओं का कारण बन जाएगा। इसके आसपास काम करना संभव है, लेकिन मैंने उस भाग को छोड़ दिया है। अगर आपको इसकी ज़रूरत है, तो मुझे बताएं, और मैं एक उदाहरण जोड़ूंगा।

import numpy as np 
import matplotlib.pyplot as plt 
np.random.seed(1977) 

def main(): 
    numpoints = 30 
    theta = np.linspace(0, 2*np.pi, numpoints) 
    r1 = np.random.random(numpoints) 
    r2 = 5 * np.random.random(numpoints) 

    params = dict(projection='polar', theta_direction=-1, theta_offset=np.pi/2) 
    fig, ax = plt.subplots(subplot_kw=params) 
    ax2 = polar_twin(ax) 

    ax.fill_between(theta, r2, color='blue', alpha=0.5) 
    ax2.fill_between(theta, r1, color='green', alpha=0.5) 

    plt.setp(ax2.get_yticklabels(), color='darkgreen') 
    plt.setp(ax.get_yticklabels(), color='darkblue') 
    ax.set_ylim([0, 5]) 
    ax2.set_ylim([0, 1]) 

    plt.show() 

def polar_twin(ax): 
    ax2 = ax.figure.add_axes(ax.get_position(), projection='polar', 
          label='twin', frameon=False, 
          theta_direction=ax.get_theta_direction(), 
          theta_offset=ax.get_theta_offset()) 
    ax2.xaxis.set_visible(False) 

    # There should be a method for this, but there isn't... Pull request? 
    ax2._r_label_position._t = (22.5 + 180, 0.0) 
    ax2._r_label_position.invalidate() 

    # Bit of a hack to ensure that the original axes tick labels are on top of 
    # whatever is plotted in the twinned axes. Tick labels will be drawn twice. 
    for label in ax.get_yticklabels(): 
     ax.figure.texts.append(label) 

    return ax2 

if __name__ == '__main__': 
    main() 
+0

यह उत्तर बहुत अच्छा था, कि मैं इसे एक से अधिक अपवोट देना चाहता था, लेकिन मैं नहीं कर सकता :(मैं कोशिश करूँगा और अपना खुद का जवाब इस के रूप में अच्छा कर दूंगा। –

+0

@GamesBrainiac - धन्यवाद! –

+0

धन्यवाद ** बहुत आपके विस्तृत और बहुत समझदार उत्तर के लिए बहुत **, यह मेरे लिए ठीक काम करता है। अभी भी कुछ समस्याएं हैं, जो मेरी पहली पोस्ट में उल्लिखित हैं। – fidelitas

1

बस मैंने पाया कि "सुनिश्चित करने के लिए हैक पर @JoeKington के (महान) जवाब जोड़ने के लिए,:

किसी भी दर पर, यहाँ पूर्ण, स्टैंड-अलोन अंतिम आंकड़ा उत्पन्न करने के लिए कोड है मूल कुल्हाड़ियों टिकटिक कि लेबल जो कुछ भी जुड़ा हुआ कुल्हाड़ियों में साजिश रची है के शीर्ष पर हैं, "मेरे लिए काम नहीं किया तो एक विकल्प के रूप में मैं का उपयोग किया है:

from matplotlib.ticker import MaxNLocator 

#Match the tick point locations by setting the same number of ticks in the 
# 2nd axis as the first  
ax2.yaxis.set_major_locator(MaxNLocator(nbins=len(ax1.get_yticks()))) 

#Set the last tick as the plot limit 
ax2.set_ylim(0, ax2.get_yticks()[-1]) 

#Remove the tick label at zero 
ax2.yaxis.get_major_ticks()[0].label1.set_visible(False) 
संबंधित मुद्दे