• 0
vector_ever

رسم المخططات البيانية

سؤال

84 إجابة على هذا السؤال .

  • 0

السلام عليكم

اعود واياكم اخواني لاكمال هذه السلسلة من الدروس عن المخططات وسنقوم اليوم بشرح درس جديد له علاقة بالوقت

حيث هناك مخططات تعتمد قيمة الوقت كقيمة اساسية ومحورية في مدخلاتها وسأقوم اليوم بمعالجة الـ  Time Series chart أو ما نسميه مخططات السلالسل الزمنية

 

post-152477-0-48154000-1365099712_thumb.

 

جدير بالذكر ان هذا النوع من المخططات لا يتبع التمثيل البياني اي لا يتبع الـ XY Charts لأن التمثيل يعتمد على المدخلات الزمنية أي انه يتبع للمخططات الزمنية او ما نستطيع أن نطلف عليه الـ Time Charts  ولكن يجب أن نعرف انه حتى هذا النوع من المخططات فانه يستخدم الـ XYPlot  من أجل بعض الخواص والخيارات الاضافية وهذا ما سنراه في الخطوة الاخيرة من الشرح

 

الخطوات كلها تقريباً مشروحة ولكن لنا وقفة مع الخطوة الأولى لشرح الجديد فيها فلنبدأ على بركة الله.


1- create a dataset

 

    // create a dataset...    TimeSeries s1 = new TimeSeries("Cars Industry in Germany", Month.class);    s1.add(new Month(2, 2001), 181.0);    s1.add(new Month(3, 2001), 167.0);    s1.add(new Month(4, 2001), 153.0);    s1.add(new Month(5, 2001), 167.0);    s1.add(new Month(6, 2001), 158.0);    s1.add(new Month(7, 2001), 148.0);    s1.add(new Month(8, 2001), 153.0);    s1.add(new Month(9, 2001), 142.0);    s1.add(new Month(10, 2001), 123.0);    s1.add(new Month(11, 2001), 131.0);    s1.add(new Month(12, 2001), 139.0);    s1.add(new Month(1, 2002), 142.0);    s1.add(new Month(2, 2002), 138.0);    s1.add(new Month(3, 2002), 137.0);    s1.add(new Month(4, 2002), 143.0);    s1.add(new Month(5, 2002), 139.0);    s1.add(new Month(6, 2002), 137.0);    s1.add(new Month(7, 2002), 132.0);        TimeSeries s2 = new TimeSeries("Cars Industry in USA", Month.class);    s2.add(new Month(3, 2001), 123.0);    s2.add(new Month(4, 2001), 117.0);    s2.add(new Month(5, 2001), 124.0);    s2.add(new Month(6, 2001), 122.0);    s2.add(new Month(7, 2001), 119.0);    s2.add(new Month(8, 2001), 116.0);    s2.add(new Month(9, 2001), 112.0);    s2.add(new Month(10, 2001), 101.0);    s2.add(new Month(11, 2001), 106.0);    s2.add(new Month(12, 2001), 110.0);    s2.add(new Month(1, 2002), 111.0);    s2.add(new Month(2, 2002), 111.0);    s2.add(new Month(3, 2002), 109.0);    s2.add(new Month(4, 2002), 113.0);    s2.add(new Month(5, 2002), 111.0);    s2.add(new Month(6, 2002), 108.0);    s2.add(new Month(7, 2002), 101.0);    TimeSeriesCollection dataset = new TimeSeriesCollection();    dataset.addSeries(s1);    dataset.addSeries(s2);    dataset.setDomainIsPointsInTime(true);

حسنا هنا لدينا صنف من نوع السلاسل الزمنية TimeSeries حيث ان هذا الصنف ننشأ منه كائن يحمل قيمتان:

القيمة الأولى هي قيمة نصية String لتوضيح ما نحب ان نمثله بهذه القيمة (حيث واضح من الكود أنني أحب ان أمثل انتاج السيارات في كل من الولايات المتحدة والمانيا خلال فترة زمنية أقوم بتحديدها والتي هي القيمة الثانية) أما القيمة الثانية هي قيمة زمنية نلاحظ اننا اخترنا القيمة  Month.class اي التمثيل حسب الشهر.

 

حسناً هل أستطيع تمثيل قيم الزمن بقيم أخرى غير الشهر؟

نعم تستطيع ذلك حيث نستطيع تمثيلها حسب السنة او الشهر أو الأسبوع أو اليوم والساعة والدقيقة والثانية....

جميل أليس كذلك لكن انتبه أن القيمة الزمنية المحورية في كل هذا هي القيمة الأكبر أي السنة, بمعنى انني لا أستطيع تمثيل الأشهر دون السنة أي يجب أن أذكر مثلا انه في الشهر الفلاني من السنة الفلانية ثم انتاج مثلا 300 سيارة ولا يجوز أن أذكر أنه مثلا فقط تم انتاج سيارة في الشهر الخامس مثلا دون ذكر السنة, لكن أستطيع ان أذكر انه مثلاً تم انتاج 5 ملايين سيارة في سنة 2010 في ألمانيا بالمجمل( هنا لم نذكر اي شهر او أسبوع لأن السنة هي القيمة الجامعة والأكبر) وهذا لا يقتصر فقط على الشهر انما على ما دونه أي الأسبوع واليوم والساعة والدقيقة والثانية لكن هنا مثلا لو ذكرت الأسبوع يجب أن احدد مثلا الاسبوع الرابع عشر من سنة 2009 مثلا فلا داعي للشهر اما بالنسبة لليوم فيجب ذكر اليوم والشهر والسنة والساعة نذكر فيها الساعة واليوم والشهر والسنة وهكذا بالنسبة للدقيقة والثانية كل قيمة تذكر الأكبر منها حتى الوصول للسنة.

 

حسناً سأقوم بتلخيص كلامي بصيغة كود ليكون الأمر واضحاً وأسهل وليكن لدينا المثال التالي:

 

    TimeSeries s1 = new TimeSeries("Year", Year.class);    s1.add(new Year(int year), int value);    TimeSeries s2 = new TimeSeries("Month", Month.class);    s2.add(new Month(int month, int year), int value);    TimeSeries s3 = new TimeSeries("Week", Week.class);    s3.add(new Week( int week, int year), int value);    TimeSeries s4 = new TimeSeries("Day", Day.class);    s4.add(new Day(int day, int month, int year), int value);          TimeSeries s5 = new TimeSeries("Hour", Hour.class);    s5.add(new Hour(int hour, int day, int month, int year), int value);        TimeSeries s6 = new TimeSeries("Minute", Minute.class);    s6.add(new Minute(int minute, int hour, int day, int month, int year), int value);    TimeSeries s7 = new TimeSeries("Second", Second.class);    s7.add(new Second(int second, int minute, int hour, int day, int month, int year), int value);
أعتقد أن الأمور أصبحت واضحة الآن ولك الحرية باستخدام أي قيمة من القيم مجتمعة او لا حسب  الحاجة

2- create a chart

 

    // create the chart...    JFreeChart chart = ChartFactory.createTimeSeriesChart(            "Cars Production in Germany & USA", // title            "Date", // x-axis label            "1000 cars  Per month", // y-axis label            dataset, // data            true, // create legend?            true, // generate tooltips?            false // generate URLs?            );

هنا قمنا باعطاء الامر لرسم مخططات السلاسل الزمنية حسب القيم السابقة

 


4- Extras and the modifications وهنا سنقوم ببعض الشروحات مع انه اغلب الخطوات في هذه الفقرة تم شرحها مسبقاً

أولاً: تحديد لون الخلفية الخارجية   

      //1- set colors for External background    chart.setBackgroundPaint(Color.white);    

 

ثانياً: تحديد لون الخلفية الداخلية

    //2- set colors for Internal background    XYPlot plot = (XYPlot) chart.getPlot();    plot.setBackgroundPaint(Color.lightGray);    

 

ثالثاً: تثبيت وتحديد لون الخطوط داخل الخلفية الداخلية (grid lines) حيث يتم الرسم

    //3- set colors for grid lines    plot.setDomainGridlinePaint(Color.white); // Vertical grid lines    plot.setRangeGridlinePaint(Color.white);  // Horizontal grid lines

 

رابعاً: تغيير ألوان الخطوط التي سيتم رسمها

    //4 - set colors for renderer    XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();    renderer.setSeriesPaint(0, Color.green);// color of first set of points    renderer.setSeriesPaint(1, Color.black);// color of second set of points    renderer.setSeriesPaint(2, Color.blue); // color of third set of points    plot.setRenderer(renderer); 

 

خامساً: تحديد بعض الخواص والخيارات حسب الرغبة فيما اذا كانت الشكل الذي سيرسم ممثلا للقيم المعطاة هل سيتم رسمه بشكل مصمت (مملوء) ام فارغ وفي اذا هناك رغبة برسم هذه الأشكال أم لا و أيضا اذا كانت هناك رغبة في رسم السلسلة الزمنية الممثلة للقيم أم لا

    //5- Shapes & Lines Visibility    renderer.setBaseShapesFilled(true);        // to set the shape empty if (false)    renderer.setSeriesLinesVisible(1, true);   // to remove the Line just if (false)    renderer.setSeriesShapesVisible(0, true);  // to remove the shapes if (false)    renderer.setSeriesShapesVisible(1, true);    

الأفضل لك أن تجرب هذه الخطوة وتقوم كل مرة في كل سطر بتغير القيم لترى الفرق وفائدة هذه الخطوة

جدير بالذكر أن القيمة الافتراضية لهذه الخيارات هو true

 

سادساً: وأخيراً هذه الخطوة مسؤولة عن الشكل الذي أرغب بظهور الوقت والتاريخ على المخطط

    //6 - set the date format    DateAxis axis = (DateAxis) plot.getDomainAxis();    axis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));

لاحظ اننا نرغب بظهور السنة في أربع خانات أي كاملة والشهر فقط أول ثلاثة حروف منه

طبعا علينا التعديل هنا لو رغبنا باضافة الاسابيع او الايام والساعات والى ما هنالك

 

والآن نأتي الى الكود النهائي

 

import java.awt.Color;import java.awt.Dimension;import java.text.SimpleDateFormat;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartPanel;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.DateAxis;import org.jfree.chart.plot.XYPlot;import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;import org.jfree.data.time.Day;import org.jfree.data.time.Hour;import org.jfree.data.time.Minute;import org.jfree.data.time.Month;import org.jfree.data.time.Second;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;import org.jfree.data.time.Week;import org.jfree.data.time.Year;import org.jfree.ui.ApplicationFrame;import org.jfree.ui.RefineryUtilities;public class TimeSeriesChart extends ApplicationFrame {/*** A demonstration application showing how to create a simple time series* chart. This example uses monthly data.** @param title the frame title.    */    public TimeSeriesChart(String title) {    super(title);        // create a dataset...    TimeSeries s1 = new TimeSeries("Cars Industry in Germany", Month.class);    s1.add(new Month(2, 2001), 181.0);    s1.add(new Month(3, 2001), 167.0);    s1.add(new Month(4, 2001), 153.0);    s1.add(new Month(5, 2001), 167.0);    s1.add(new Month(6, 2001), 158.0);    s1.add(new Month(7, 2001), 148.0);    s1.add(new Month(8, 2001), 153.0);    s1.add(new Month(9, 2001), 142.0);    s1.add(new Month(10, 2001), 123.0);    s1.add(new Month(11, 2001), 131.0);    s1.add(new Month(12, 2001), 139.0);    s1.add(new Month(1, 2002), 142.0);    s1.add(new Month(2, 2002), 138.0);    s1.add(new Month(3, 2002), 137.0);    s1.add(new Month(4, 2002), 143.0);    s1.add(new Month(5, 2002), 139.0);    s1.add(new Month(6, 2002), 137.0);    s1.add(new Month(7, 2002), 132.0);        TimeSeries s2 = new TimeSeries("Cars Industry in USA", Month.class);    s2.add(new Month(3, 2001), 123.0);    s2.add(new Month(4, 2001), 117.0);    s2.add(new Month(5, 2001), 124.0);    s2.add(new Month(6, 2001), 122.0);    s2.add(new Month(7, 2001), 119.0);    s2.add(new Month(8, 2001), 116.0);    s2.add(new Month(9, 2001), 112.0);    s2.add(new Month(10, 2001), 101.0);    s2.add(new Month(11, 2001), 106.0);    s2.add(new Month(12, 2001), 110.0);    s2.add(new Month(1, 2002), 111.0);    s2.add(new Month(2, 2002), 111.0);    s2.add(new Month(3, 2002), 109.0);    s2.add(new Month(4, 2002), 113.0);    s2.add(new Month(5, 2002), 111.0);    s2.add(new Month(6, 2002), 108.0);    s2.add(new Month(7, 2002), 101.0);            TimeSeriesCollection dataset = new TimeSeriesCollection();    dataset.addSeries(s1);    dataset.addSeries(s2);    dataset.setDomainIsPointsInTime(true);        // create the chart...    JFreeChart chart = ChartFactory.createTimeSeriesChart(            "Cars Production in Germany & USA", // title            "Date", // x-axis label            "1000 cars  Per month", // y-axis label            dataset, // data            true, // create legend?            true, // generate tooltips?            false // generate URLs?            );        // add the chart to a panel...    ChartPanel chartPanel = new ChartPanel(chart);    chartPanel.setPreferredSize(new Dimension(500, 270));    setContentPane(chartPanel);        // Extras and the modifications            //1- set colors for External background    chart.setBackgroundPaint(Color.white);        //2- set colors for Internal background    XYPlot plot = (XYPlot) chart.getPlot();    plot.setBackgroundPaint(Color.lightGray);        //3- set colors for grid lines    plot.setDomainGridlinePaint(Color.white); // Vertical grid lines    plot.setRangeGridlinePaint(Color.white);  // Horizontal grid lines    //4 - set colors for renderer    XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();    renderer.setSeriesPaint(0, Color.green);// color of first set of points    renderer.setSeriesPaint(1, Color.black);// color of second set of points    renderer.setSeriesPaint(2, Color.blue); // color of third set of points    plot.setRenderer(renderer);        //5- Shapes & Lines Visibility    renderer.setBaseShapesFilled(true);        // to set the shape empty if (false)    renderer.setSeriesLinesVisible(1, true);   // to remove the Line just if (false)    renderer.setSeriesShapesVisible(0, true);  // to remove the shapes if (false)    renderer.setSeriesShapesVisible(1, true);        //6 - set the date format    DateAxis axis = (DateAxis) plot.getDomainAxis();    axis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));        }    /**    * Starting point for the demonstration application.    *    * @param args ignored.    */    public static void main(String[] args) {    TimeSeriesChart demo = new TimeSeriesChart("Time Series Demo ");    demo.pack();    RefineryUtilities.centerFrameOnScreen(demo);    demo.setVisible(true);    }    }

post-152477-0-45465500-1365104877_thumb.

تم تعديل بواسطه vector_ever
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

 اريد عمل رسم بيانى علاقه بين ... BER  &  SNR

 

بحيث عن اعطاء البرنامج قيمه لاحدهما .. يعطينى القيمه المقابله له عند الأخر

 

electrical_noise_fig8.6.jpg

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

وما هو الـ  BER  &  SNR ؟؟

 

في ابداية احتاج لتعريف ما هي العلاقة الرياضية بينهما

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الف شكر على هذا المجهود الرائع. اتمنى لك الموفقية والنجاح.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

 

اتماما وتعديلا لمشاركتي رقم 47 و 48 عن XY Line Chart فهي عبارة عن اضافة لا تتجاوز السطر  الواحد ولكنني اجدها قد تكون مرغوبة وتعطي خيارات لم يريد استخدام هذا النوع من الرسوم البيانية في عرض نتائجه

 

في خطوات كتابة الكود كنت أكتب 

//4 - set colors for renderer     XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();            renderer.setSeriesPaint(0, Color.green);// color of first Line            renderer.setSeriesPaint(1, Color.red);// color of second Line            renderer.setSeriesPaint(2, Color.blue); // color of third Line            plot.setRenderer(renderer);

فينتج لدينا خطوط مستقيمة

post-152477-0-30773800-1390742821_thumb.

 

هذه الخطوط المستقيمة نتيجة استخدامنا الأمر XYLineAndShapeRenderer لكن لو احببنا استخدام خطوط منحنية فاننا سنستخد عوضا عن ذلك الأمر XYSplineRenderer

XYSplineRenderer  renderer = new XYSplineRenderer ();//Curved linesrenderer.setSeriesPaint(0, Color.green);// color of first Linerenderer.setSeriesPaint(1, Color.red);// color of second Linerenderer.setSeriesPaint(2, Color.blue); // color of third Lineplot.setRenderer(renderer);

فيكون الشكل الناتج كما يلي

 post-152477-0-69494100-1390743150_thumb.
 
ولا تغيير في بقية الكود سوا اضافة المكتبة في بداية الكود 
import org.jfree.chart.renderer.xy.XYSplineRenderer;

وشكرا

 

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

رائع بارك الله فيك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اريد السؤال على مسألة معينة بخصوص PIECHART :

			dataset.setValue("Category 3", 79.5);

هل يمكن استعمال متغير "VARIABLE" مكان "CATEGORY 3" ، أي أن الصنف يتغير بحسب قاعدة البيانات....

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .