2012-06-07 16 views
8

मैं एक ऐप प्रोग्रामिंग कर रहा हूं जहां मेरे पास दो वाई अक्ष और एक एक्स अक्ष के साथ ग्राफ है। बाएं वाई धुरी 0 से 20 तक है इसलिए 20 प्रमुख टिक अक्ष हैं। राइट वाई धुरी 0 से 10 तक है, इसलिए मैं बाएं वाई अक्ष को प्रत्येक वैकल्पिक प्रमुख TickAxis के लिए लेबल करना चाहता हूं।विभिन्न अक्ष स्केल के साथ कोर प्लॉट ग्राफ़ में दो वाई अक्ष

यहाँ मेरी कोड स्निपेट

//code 
    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 
float xmax=10.0; 
float xmin=0.0; 
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(xmin)  length:CPTDecimalFromFloat(xmax-xmin)]; 
float ymax=20.0; 
float ymin=0.0; 
float ymax2=10.0; 
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(ymin) length:CPTDecimalFromFloat(ymax-ymin)]; 



// Grid line styles 
CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle]; 
majorGridLineStyle.lineWidth = 0.75; 
majorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.75]; 

CPTMutableLineStyle *minorGridLineStyle = [CPTMutableLineStyle lineStyle]; 
minorGridLineStyle.lineWidth = 0.25; 
minorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.1]; 

CPTMutableLineStyle *redLineStyle = [CPTMutableLineStyle lineStyle]; 
redLineStyle.lineWidth = 2.0; 
redLineStyle.lineColor = [[CPTColor redColor] colorWithAlphaComponent:0.5];       

CPTMutableLineStyle *greenLineStyle = [CPTMutableLineStyle lineStyle]; 
greenLineStyle.lineWidth = 2.0; 
greenLineStyle.lineColor = [[CPTColor greenColor] colorWithAlphaComponent:0.5];  

// Axes 
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)self.graph.axisSet; 
CPTXYAxis *x   = axisSet.xAxis; 
x.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0"); 
x.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"1"] decimalValue]; 
x.minorTicksPerInterval  = 4; 
x.labelOffset = 3.0f; 
x.title   = @"Time"; 
x.titleOffset = 20.0; 
x.titleLocation = CPTDecimalFromFloat((xmax+xmin)/2); 
x.majorGridLineStyle= majorGridLineStyle; 
x.minorGridLineStyle=minorGridLineStyle; 


CPTXYAxis *y = axisSet.yAxis; 
y.majorIntervalLength   = CPTDecimalFromString(@"1.0"); 
y.majorTickLength=2.0f; 
y.minorTicksPerInterval  = 4; 
y.orthogonalCoordinateDecimal = CPTDecimalFromFloat(0.0); 
y.labelExclusionRanges = [NSArray arrayWithObjects: 
          [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(0.0) 
                 length:CPTDecimalFromInteger(0.0)],Nil]; 
y.majorGridLineStyle= majorGridLineStyle; 
y.minorGridLineStyle=minorGridLineStyle; 


CPTXYAxis *y2 = [[(CPTXYAxis *)[CPTXYAxis alloc] initWithFrame:CGRectZero] autorelease]; 
y2.plotSpace =plotSpace;  
y2.orthogonalCoordinateDecimal = CPTDecimalFromFloat(xmax); 
y2.majorGridLineStyle=majorGridLineStyle; 
y2.minorGridLineStyle=minorGridLineStyle; 
y2.minorTicksPerInterval  = 4; 
y2.majorIntervalLength  = CPTDecimalFromString(@"1.0"); 
y2.labelOffset  = 10.0; 
y2.coordinate   =CPTCoordinateY; 

y2.axisLineStyle  = x.axisLineStyle; 
y2.labelTextStyle    = x.labelTextStyle; 
y2.labelOffset     = -30.0f; 
y2.visibleRange    = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(0) length:CPTDecimalFromInteger(ymax2)]; 


y2.title      = @"Temperature"; 
y2.titleLocation    = CPTDecimalFromInteger(5.0); 
y2.titleTextStyle    =x.titleTextStyle; 
y2.titleOffset     =-45.0f; 
y2.labelExclusionRanges = [NSArray arrayWithObjects: 
          [CPTPlotRange plotRangeWithLocation:CPTDecimalFromInteger(0.0) 
                 length:CPTDecimalFromInteger(0.0)],Nil]; 


self.graph.axisSet.axes = [NSArray arrayWithObjects:x, y, y2, nil]; 

// Create a plot that uses the data source method for red graph 
CPTScatterPlot *redPlot = [[[CPTScatterPlot alloc] init] autorelease]; 
redPlot.identifier = @"red Plot";; 

CPTMutableLineStyle *lineStyle = [[redPlot.dataLineStyle mutableCopy] autorelease]; 
lineStyle.miterLimit  = 1.0f; 
redPlot.dataLineStyle = redLineStyle; 
redPlot.dataSource = self; 
redPlot.interpolation = CPTScatterPlotInterpolationStepped; 

[self.graph addPlot:redPlot]; 

// Create a plot that uses the data source method for green graph 
CPTScatterPlot *greenPlot = [[[CPTScatterPlot alloc] init] autorelease]; 
greenPlot.identifier = @"green Plot";; 

CPTMutableLineStyle *greenlineStyle = [[greenPlot.dataLineStyle mutableCopy] autorelease]; 
greenlineStyle.miterLimit  = 1.0f; 
greenPlot.dataLineStyle = greenLineStyle; 
greenPlot.dataSource = self; 
[self.graph addPlot:greenPlot]; 

// Add some data 
NSMutableArray *newData = [NSMutableArray arrayWithCapacity:100]; 
NSUInteger i; 
for (i = 0; i < 45; i++) { 
    id x = [NSNumber numberWithDouble:i * 0.2]; 
    id y = [NSNumber numberWithDouble:i * rand()/((double)RAND_MAX*5.0) ];   
    [newData addObject:[NSDictionary dictionaryWithObjectsAndKeys: 
     x, @"x",y, @"y",nil]]; 
} 
NSMutableArray *newData1 = [NSMutableArray arrayWithCapacity:100]; 
for (i = 0; i < 45; i++) { 
    id x =[NSNumber numberWithDouble:i * rand()/((double)RAND_MAX*5.0) ]; 
    id y2 = [NSNumber numberWithDouble:i * 0.2]; 
    [newData1 addObject:[NSDictionary dictionaryWithObjectsAndKeys: 
         x, @"x",y2, @"y2",nil]]; 
} 
self.plotData = newData; 
self.plotData2=newData1; 
+0

सेट 'labelExclusionRanges' यदि आपको इसकी आवश्यकता नहीं है तो 'शून्य 'तक। –

उत्तर

10

आप दो y अक्षों अलग तराजू करना चाहते हैं है, तो आप एक और साजिश अंतरिक्ष जोड़ने की जरूरत है। दूसरा भूखंड अंतरिक्ष के लिए एक ही xRange का प्रयोग करें, लेकिन एक अलग yRange, जैसे,

CPTXYPlotSpace *plotSpace2 = [[[CPTXYPlotSpace alloc] init] autorelease]; 
plotSpace2.xRange = plotSpace.xRange; 
plotSpace2.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(ymin) 
               length:CPTDecimalFromFloat(ymax2 - ymin)]; 
[graph addPlotSpace:plotSpace2]; 
y2.plotSpace = plotSpace2; 

का उपयोग majorIntervalLength का प्रयोग करें टिक और ग्रिड लाइन के स्थान को नियंत्रित करने के:

y.majorIntervalLength = CPTDecimalFromFloat((ymax - ymin)/10.0f); 
y2.majorIntervalLength = CPTDecimalFromFloat((ymax2 - ymin)/10.0f); 
+0

हाय एरिक, बहुत बहुत धन्यवाद, आपका कोड बहुत उपयोगी था, अब मेरे पास वाई अक्ष – raja

+0

दोनों के लिए अलग-अलग पैमाने हैं, यदि मैं अपने मान प्रदर्शित करने के लिए बार का उपयोग करता हूं और मेरे पास दो प्लॉट रिक्त स्थान के साथ दो वाई अक्ष हैं (जहां कोई लाल है और है उदाहरण के लिए हरा) और वे एक ही एक्स-अक्ष का उपयोग करते हैं, जो उन्हें एक-दूसरे पर प्रस्तुत करेंगे, उदाहरण के लिए मेरा पहला बार बार का प्रतिनिधित्व करने वाला लाल बार उसी एक्स-अक्ष स्थिति पर दूसरे मान का प्रतिनिधित्व करने वाले हरे रंग के साथ कवर किया जाएगा। मैं वास्तव में उन लाल और हरे रंग की सलाखों को x-axis मान के चारों ओर केंद्रित करने के लिए पसंद करूंगा ताकि वे दोनों दिखाई दे सकें। क्या यह संभव है? – Ewoks

+0

आप एक बार या दोनों भूखंडों को सामान्य केंद्र रेखा से दूर करने के लिए 'बार ऑफसेट' संपत्ति का उपयोग कर सकते हैं ताकि आप दोनों को देख सकें। –