Monday, August 30, 2021

 হ্যাঁ, R এর ggplot2 প্যাকেজে পাই চার্টের মতো নান্দনিক চার্ট আঁকার সরাসরি কোনো উপায় নেই। আঁকতে হয় বার চার্ট থেকে ঘুরিয়ে। কিন্তু আসলেই কি চার্ট দুটো আলাদা? আসলে তো পাই চার্টও এক ধরনের বার চার্টই! যেখানে বারগুলো সোজা দাঁড়িয়ে না থেকে বৃত্তাকার পথে চলছে। উপরের দিকে না গিয়ে ঘুরছে। 

এই যে চার্টটিই দেখুন। পাই চার্টের এরিয়াগুলোকে চাইলে আপনি কৌণিক পথ বেয়ে চলা বার বা স্তম্ভ মনে করতে পারেন। 

এখন আমরা ধাপে ধাপে দেখব, কীভাবে বার চার্টটিকে আপনি পাই চার্টে রূপান্তরিত করবেন। 

আমরা কাজ করব নিচের ডেটাটি দিয়ে। এটা হলো যুক্তরাষ্ট্রের বিভিন্ন জাতিগোষ্ঠীর মানুষের শতাংশ। 


এবার এখান থেকে বার চার্টটি আগে এঁকে ফেলি। বার চার্টের সংখ্যাগুলো একটি কলামে উপস্থিত থাকলে geom_bar() এর ভেতরে stat="identity" দিতে হয়। আর যদি এভাবে থাকে: true, false, false, true ইত্যাদি, তাহলে stat="identity" দেওয়া লাগবে না। width না দিলেও হবে। সেক্ষেত্রে স্বয়ংক্রিয়ভাবে বারগুলো মোটা বা চিকন হবে। 



%>% চিহ্নটির নাম পাইপ অপারেটর। এভাবে লেখা আর ggplot(data=us_races, aes...) লেখা একই কথা। তবে এটা ব্যবহার করতে হলে tidyverse প্যাকেজ লোড করে নিলেই। একই সাথে পাইপের magrittr, ggplot2, dplyrসহ অনেকগুলো দরকারি প্যাকেজ লোড হয়ে যাবে। 


এবারে RColorBrewer প্যাকেজ দিয়ে বারের কালারগুলো সাজিয়ে নেই। না করলেও ক্ষতি নেই। পাশাপাশি বারের মধ্যেই প্রতিটি বারের সাথে সংশ্লিষ্ট সংখ্যাগুলো দেখিয়ে দেই। 


 

খেয়াল করুন বারে ডান পাশে লিজেন্ড থাকার আসলে কোনো প্রয়োজন নেই। এটাকে ফেলেই দেওয়া যায়। 



এবার পাই চার্ট বানানো শুরু করা যাক। প্রথম কাজ হলো, x অক্ষে Race রাখা যাবে না। পাই চার্টে যেহেতু এরিয়াগুলো একটা আরেকটার ওপরে থাকবে, তাই y অক্ষে সংখ্যাগুলো বসিয়ে Race দিয়ে কালার করে নিচ্ছি। 




এটাকে পাই চার্ট বলার সময় হয়নি এখনও। পাই চার্ট হবার জন্যে প্রস্তুত বলতে পারি। 

এখন সে কাজটাই করব। বারগুলোকে ঘুরিয়ে দিতে হবে। এটাই করবে coord_polar() ফাংশনটা। 



দেখতে পাই চার্টের মতোই হয়েছে। তবে x অক্ষ, y অক্ষ ও আরও নানান জায়গায় অপ্রয়োজনীয় জিনিসে ভর্তি। এগুলো সরিয়ে একটু ক্লিন করি। theme_void() কাজটা করে দেবে। 




এখন মোটামুটি কাজ চলার অবস্থায় আছে। এখনও অনেক কাজ করার সুযোগ আছে। লিজেন্ড না দিয়ে এরিয়ার ওপরই লেবেল দিয়ে দিলে ভাল হয়। এছাড়াও এরিয়ার মধ্যেই সংখ্যা বা পারসেন্টেজ দেখানো যায়। আমাদের ডেটায় অবশ্য সংখ্যাগুলোই পারসেন্টেজ। তাই দুটো একই কথা। 



এবার কালার কম্বিনেশন আরেকটু ঠিক করে নেই। 






চাইলে তো আরও কত কিছুই করা যায়। করার আগে চিন্তা করতে হবে সেটা কতটা অর্থবহ। 

পাই চার্ট ভাল না লাগলে যদি ডোনাট চার্ট আঁকতে চান, সেটাও করতে পারেন। 

Category: articles

Saturday, August 28, 2021

 পত্রিকার পাতা খুললেই ইদানিং সুন্দর সুন্দর ডোনাট চার্ট দেখা যায়। এগুলোও আসলে পাই চার্টই। তবে মাখখানে থাকে একটি ছিদ্র। 

কিছু দিন মনে করতাম, R মনে হয় এমন প্লট বানাতে পারে না। মজার ব্যাপার হলো, অন্য কেউ পারে R পারবে না এমনটা হতেই পারে না। হলে এমন হতে পারে যে R পারে কিন্তু অন্যরা (যেমন এক্সেল, SPSS পাইথন) পারে না। 

এই প্লটটাও R-এই বানিয়েছি।

এমনিতে R-এর ggplot2 প্যাকেজে পাই চার্ট বানানোর জন্যে কোনো ফাংশন নেই। তবে একটু ঘুরিয়ে চিন্তা করলেই বোঝা যায়, পাই চার্ট আসলে এক ধরনের বার চার্টই। তবে বারগুলো খাড়াভাবে না থেকে কৌণিকভাবে অবস্থান করছে। একটা যেখানে শেষ আরেকটা সেখানে শুরু। 

ওপরের ডোনাট চার্টটির দিকেই দেখুন। এরিয়াগুলোকে চাইলেই বার হিসেবে কল্পনা করতে পারেন। অতএব, ডোনাট চার্টের কায়দা কানুন বুঝতে হলে বার চার্ট বানানোর নিয়ম জানতে হবে। একদম চিন্তা নেই, অনেকগুলো পোস্টে সেটা আমরা ব্যাখ্যা করেছি। 

☛ বার প্লট বানানোর কায়দা কানুন

তাহলে বানিয়ে ফেলি। ও, আগে কিছু ডেটা বানিয়ে নেই। টেবিলটা উইকিপিডিয়া থেকে নেওয়া। 



এখানে আমি ডেটাফ্রেইম তৈরি করার জন্যে tidyverse প্যাকেজমালার tibble() ফাংশন ব্যবহার করেছি। এভাবে করতে হলে আপনাকে library(tidyverse) কমান্ড দিয়ে এটা লোড করে নিতে হবে। চাইলে এটা লোড না করেও ডেটা বানাতে পারেন। সেক্ষেত্রে ফাংশনটা হবে data.frame()। তবে tidyverse লোড করলে সাথে সাথে ggplot2ও লোড হয়ে যায়। আলাদাভাবে ggplot2 লোড করতে রান করুন library(ggplot2)।  


এবার প্লট করে ফেললেই হলো। 

 

বার প্লট বোঝার পরেও এটা না বুঝতে না পারলে কিছু ব্যাপার খেয়াল করুন:`

  • এখানে পাই চার্ট বানানোর সুবিদার্থে আমরা geom_bar এর বদলে geom_col ব্যবহার করেছি। 
  • xlim দিয়ে ডোনাটের পুরুত্ব ঠিক করা হয়েছে। এর ওপর নির্ভর করে পাইয়ের ভেতরের ছিদ্র ছোট-বড় হবে।
  • মূলত coord_polar দিয়ে বারগুলোকে কৌণিক রূপ দেওয়া হয়েছে।
  • theme_void দিয়ে অপ্রয়োজনীয় ব্যাকগ্রাউন্ড রিমুভ করা হয়েছে। 
  • geom_text সম্পর্কে আরও জানতে এই লেখাটি দেখুন। 
  • বাকি জিনিসগুলো বিভিন্ন লেখায় আগেই বলেছি। দেখতে চাইলে দেখে নিন
  • প্লট কালারিং করার নানান উপায় দেখুন এখানে

আজ এ পর্যন্তই। 
Category: articles

Thursday, July 22, 2021

 ধরুন আমাদের কাছে একটি ডেটাফ্রেইম আছে যাতে অনেকগুলো কলাম আছে। এগুলোর সবগুলোর গড় , মধ্যমা বা পরিমিত ব্যবধান আমরা এক কমান্ডেই বের করতে চাই। 

আজকের পোস্টে আমরা R-এর বিল্ট-ইন ডেটাসেট airquality ব্যবহার করব। এতে ৬টি কলাম বা চলক আছে। Rstudio ব্যবহার করলে আপনি View(airquality) দিয়ে ডেটাকে একনজর দেখে নিতে পারেন। Rstudio ব্যবহার না করে থাকলে প্রথমে ডেটাকে লোড করে নিতে হবে।  


এবার str দিয়ে দেখে নিতে পারেন কলাম বা চলকগুলো কী ধরনের। দেখা যাবে, পাঁচটি কলামই পূর্ণ সংখ্যা দিয়ে তৈরি। একটিতে আছে ভগ্নাংশ। তাহলে সবগুলো কলামই সংখ্যাবাচক। 

তাহলে এবার গড় করে ফেলি। 

স্বাভাবিক উপায়ে গড় বের করতে গেলে হয়ত আমরা এভাবে করব:


এখানে na.rm = TRUE দেওয়ার কারণ হলো, ডেটায় কিছু মিসিং ভ্যালু  (NA) আছে। এই কথা দিয়ে আমরা বলে দিয়েছি, সেগুলোকে বাদ দিয়ে হিসাব করে দাও। 

কিন্তু এভাবে একটা একটা করে গড় বের করা প্রোগ্রামিং-এর আদর্শ বিরোধী। কাজটা করে ফেলতে হবে একটা কমান্ড দিয়েই। আর সেটা করার উপায় আছে বেশ কয়েকটি। 

আমরা চাইলে এভাবে করতে পারি:

 

 এখানে 2 দিয়ে বোঝানো হলো, আমরা কলামের গড় চাই। সারির (row) গড় চাইলে দিতাম ১। খেয়াল করে দেখুন চলকের নামসহ কত সুন্দর করে গড় দেখানো হয়েছে। আরও খেয়াল করলে দেখবেন, প্রথম দুই কলামের গড়ের জায়গায় NA লেখা। এর কারণ na.rm = TRUE দেওয়া হয়নি। দিয়ে দিন:

   

এখানে আমরা TRUE কে সংক্ষেপে T লিখেছি। এভাবে লিখলেও চলে, তবে আদর্শ কোডিং হলো না আর কি। 

 শুধু কি গড়? একইভাবে আমরা সব কলাম বা সারির অন্য কোনো তথ্যও বের করতে পারব। শুধু এতে ফাংশনটার নাম দিয়ে দিতে হবে। যেমন মধ্যমা বা পরিমিত ব্যবধান (standard deviation) বের করতে হলে:


এখন, মজার ব্যাপার হলো গড় বের করতে চাইলে এতটুকুও কষ্ট করার দরকার নেই আসলে। কল্পনাও করতে পারবেন না, এর চেয়েও সহজ একটি কোডও আছে। কলামের গড় বের করতে চাইলে:

  

একইভাবে সারির গড় বের করতে চাইলে ফাংশনটা হবে rowMeans()। 

আপাতত আর কোনো কৌশল দেখব না। তার চেয়ে একটা সমস্যার সমাধান করি। আমরা উপরে যে উদাহরণ দেখলাম, এখানে সবগুলো কলাম ছিল সংখ্যাসূচক। নিউমেরিক বা ইন্টিজার। যদি এক বা একাধিক character ভেক্টর থাকে? যেমন ধরুন আমরা যদি mpg ডেটা দিয়ে এই কাজ করতে যাই তাহলে কী হয় দেখুন:

 

error দেখাবে। তাহলে সমাধান হলো সংখ্যাবাচক কলামগুলোকে আলাদা করে নিতে হবে।

 

অথবা ব্যবহার করতে পারেন tidyverse প্যাকেজমালা থেকে dplyr এর ফাংশনটা।

 

এসব উপায়ে গড় বের করার আরেকটা সুবিধাও আছে। গ্রাফ আঁকতে চাইলেও ডেটা প্রস্তুত হয়েই আছে। যেমন ধরুন, আমরা যদি airquality ডেটার গড়গুলো বারপ্লটে দেখাতে চাই। 



ডেটাফ্রেইমের কলাম ইনফরমেশন থেকে সহজ বারপ্লট

☛ প্লট আঁকার কলাকৌশল দেখতে দেখুন এই লিঙ্কটি। 

ব্যস! হ্যাপি প্রোগ্রামিং !!!
Category: articles

Wednesday, August 12, 2020

দিন দিন R-এ ম্যাপ আঁকা সহজ থেকে সহজতর হচ্ছে। একটু চেষ্টা করেই কোভিড-১৯ মহামারীর চিত্র ওয়ার্ল্ড ও বাংলাদেশের ম্যাপে দেখিয়ে ফেলতে পেরেছি। কীভাবে এত কঠিন কাজ সহজ হলো সেটা বলতেই আজকের লেখা।

বাংলাদেশের কোভিড-১৯ মহামারীর প্রকোপ 
আগে অবশ্যই দরকারি প্যাকেজগুলো লোড করে নিতে হবে।



এখন প্রশ্ন হলো ম্যাপ আঁকার ডেটা পাব কোথায়? একটুও চিন্তা করবেন না। এসব ডেটা অনেক মহামানুষ কষ্ট করে বানিয়ে রেখেছেন। আপনাকে শুধু খুঁজে নিয়ে ব্যবহার করতে হবে এই যা। ম্যাপ আঁকার জন্য প্রয়োজনীয় শেইপফাইল পাবেন এখানে

ডাউনলোড করে নিয়ে আনজিপ করে নিন। এবার কী করবেন সেটা এই লেখায় আগেই বলা হয়েছে

লেখাটির plot(zilla, col="green") কোড পর্যন্ত অন্তত অনুশীলন করে আসুন।

এসেছেন তো? এবার সামনে যাওয়া যাক।

আমরা এবারে ম্যাপ আঁকব ggplot2 দিয়ে। ggplot2 সব অবজেক্টকে ডেটাফ্রেইম হিসেবে দেখতে চায়। তাই শেইপফাইলকে ডেটাফ্রেইম বানিয়ে নিতে হবে। কিন্তু সেটা এমনভাবে করতে হবে যেন ম্যাপের সবকিছু আবার উলটপালট হয়ে না যায়। সেজন্য ব্যবহার করতে হবে fortify ফাংশন।



এবার আরেকটি বড় কাজ বাকি। করোনার তথ্য এই ডেটাফ্রেইমে নিয়ে আসতে হবে। সেটা আমরা করব। তার আগে আপনি একটু দেখে নিন zilla_gg ডেটাফ্রেইমে কী আছে। এই কোড রান করতে হলে Rstudio লাগবেই আপনার।



কলামগুলো দেখে নিন একবার। ও আচ্ছা, তার আগে শুধু zilla অবজেক্টটাও দেখে নিন। খেয়াল করলে দেখবেন NAME_2 কলামে দেশের জেলাগুলোর নাম আছে। তবে fortify করার পর এতকিছু নেই। ম্যাপের তথ্য এখানে long, lat নামে দ্রাঘিমা ও অক্ষাংশ হিসেবে সংরক্ষিত আছে। zilla_ggতে id নামে একটি কলাম আছে। একটু মিলিয়ে দেখলে বুঝবেন এটা আসলে ৬৪ জেলার জন্য ইউনিক আইডি। শুরু ০ থেকে আর শেষ ৬৩-তে। এখন এই আইডির বিপরীতে আমাদের করোনার তথ্য বসিয়ে নিলেই আমাদের ডেটা প্রস্তুত।

কাজটি একটু বিরক্তিকর। সেটাকে সহজ করার জন্যে আমি সবসময় একটি csv ফাইল রেডি রাখি। আপনি চাইলে এখান থেকে ফাইলটি ডাউনলোড করে নিতে পারেন। corona নামে এখানে একটি কলাম আছে। এই কলামটি আপডেট তথ্য দিয়ে পূর্ণ করা আপনার দায়িত্ব। এখন কাজ হলো এই তথ্যকে zilla_gg ডেটাফ্রেইমে নিয়ে আসা।

সেটা করার জন্যে আমরা ব্যবহার করব dplyr প্যাকেজের left_join ফাংশন। এই ফাংশনগুলো কীভাবে কাজ করে দেখতে হলে এখানটায় ঢুঁ মেরে আসুন। ও, তার আগে csv ফাইলটা পড়ে নিই। আরেকটি কাজ করা লাগবে। zilla_gg এর id কলামটা character হয়ে আছে। কিন্তু আমাদের csv ফাইলে id কলাম হলো numeric। তাই zilla_gg কে numeric করে নিতে হবে।
তারপর জয়েন করে ফেলি।



এবার শুধুই আঁকা।



আপাতত আমরা এটা পেলাম।

কিন্তু নিজের ইচ্ছেমতো রং দেওয়া না গেলে কি আর মনে শান্তি পাওয়া যায়? এজন্যে RColorBrewer প্যাকেজ দারুণ উপকার করে। তবে এখানে আমরা সেটা ছাড়াই রং করে ফেলব। আগের কোডের পরে "+" চিহ্ন দিয়ে এটা যুক্ত করে দিন।



এবারে কিন্তু আমরা উপরে দেখানো ম্যাপই পেয়ে গেলাম। এখানে যেহেতু আমরা মৃত্যু দেখাচ্ছি, তাই লাল থেকে হলুদ রংয়ের দিকে গিয়েছি। অন্য ক্ষেত্রে অন্য কালার কম্বিনেশন ব্যবহার করাই ভাল। আরও বেশি কালার কম্বিনেশনের জন্যে আমি এই লিংকটা কাজে লাগাই। আপনিও লাগাতে পারেন।

আরও পড়ুন:  
☛ R প্রোগ্রামিং: প্লট কালারিং এর ৯ উপায়

মূল কাজ তো শেষ। এখন আরও কিছু ফাইন-টিউনিং করে নিলে মন্দ কী!

Category: articles

Friday, October 11, 2019

বিক্ষেপ চিত্র (scatter plot) এমনিতেই দারুণ। নতুন করে একে আবার দারুণ বলার আসলে হয়ত খুব বেশি কারণ নেই। কিন্তু আবার আছে।

বিক্ষেপ চিত্রের মাধ্যমে আমরা দুটো সংখ্যাবাচক চলকের (quantitative variable) মধ্যে সম্পর্ক বুঝতে পারি। যেমন নীচের বিক্ষেপ চিত্রটাই দেখুন, এখানে টেস্ট ক্রিকেট খেলা দলগুলোর জেতা ও হারা ম্যাচের সংখ্যা দেখানো আছে।
টেস্ট-খেলুড়ে দলগুলোর হারা-জেতা ম্যাচের সংখ্যা 
দেখে বোঝা যাচ্ছে জেতা ম্যাচের সঙ্গে একটি ধনাত্মক সম্পর্ক আছে। যারা বেশি ম্যাচ জিতেছে, তারা আবার হেরেছেও বেশি। তাহলে এর মানে দাঁড়ালটা কী? আসলে এর মানে হলো, প্রায় সব দলের ক্ষেত্রেই হারা ও জেতা ম্যাচের সংখ্যা সমান। তবে দুটি দলের ক্ষেত্রে জেতা ম্যাচ মাত্র কয়েকটি, কিন্তু হারা ম্যাচের সংখ্যা প্রায় ১০০। এরা নিঃসন্দেহে অধারবাহিক দল। আরও রাখটাক করে বললে, খারাপ দল।

কিন্তু এই বিক্ষেপ চিত্র থেকে চাইল আরও বেশি তথ্য পাওয়া যায়। সেটা খুবই দারুণ। তবে আগে এই প্লটের কোডটাই দেখেই নেই।

এই প্লটের কোড খুব সাধারণ। ও আচ্ছা। আমরা আজ বিক্ষেপ চিত্র আঁকব ggplot2 দিয়ে। তাই এটা লোড করতে ভুলবেন না যেন! তবে আগে ডেটা রেডি করে নেই। ডেটা পেয়েছি উইকপিডিয়ার এই পেইজ থেকে। ডেটাফ্রেইম বানাতে আমরা ব্যবহার করেছি tibble প্যাকেজ। চাইলে আপনি tibble এর জায়গায় data.frame ফাংশনও ব্যবহার করতে পারেন।



এবার আমরা আঁকার কাজটা করে ফেলি। মূল কোড কিন্তু প্রথম দুই লাইনই। পরের দুই লাইন দিয়ে লিজেন্ড সরিয়েছি, আর টাইটেল যোগ করেছি।

 

এখানে %>% কে বলা হয় পাইপ অপারেটর। চাইল আপনি test_win %>% ggplot অংশটুকুকে এভাবেও লিখতে পারেন।



এবার একই চিত্রটিকে আমরা ভিন্ন দৃষ্টিকোণ থেকে দেখি।


এবার আমরা খুব সহজে নির্দিষ্ট দেশের হারা ও জেতা ম্যাচের তুলনা করতে পারছি। যেমন জিম্বাবুয়ের পরিসংখ্যান দেখুন। জেতা ম্যাচের সংখ্যা গুটিকয়েক। কিন্তু হারা ম্যাচের সংখ্যা সে তুলনায় অনেক বেশি। প্রায় ৭০। বাংলাদেশের অবস্থা তো আরও খারাপ। পাকিস্তান ও দক্ষিণ আফ্রিকার হারা ও জেতার ম্যাচের সংখ্যা প্রায় সমান। তবে ভারতের কিন্তু জেতার চেয়ে হারার রেকর্ড বেশি। 

বলা চলে, অস্ট্রেলিয়ার রেকর্ড সবচেয়ে ভালো। জিতেছে প্রায় ৪০০ ম্যাচে, কিন্তু হেরেছে মাত্র ২২০ এর মতো ম্যাচ (প্লট দেখে বলছি। ডেটা দেখলে তো দেখাই যাবে ২২৪ ম্যাচ)। অস্ট্রেলিয়ার চেয়ে কম ম্যাচ খেলেও বেশি হেরেছে ইংল্যান্ড। কত দারুণ তথ্য দিচ্ছে সাধারণ এক বিক্ষেপ চিত্র! কোডটা তাহলে এবার দেখে নেই। 



কাজ তো শেষ। এবার আমরা চাইলে প্লটখানাকে আরও উন্নত করতে পারি। নামের সাথে পয়েন্টও দেখাতে পারি। তবে সেজন্যে geom_text কে একটু ইডিট করে পয়েন্ট থেকে একটু পাশে সরিয়ে দিতে হবে। না হলে একটি আরেকটির ওপরে পড়ায় কোনটিই ভাল দেখা যাবে না। 



এটা দেখেই অনেক ভালো বোঝা যাচ্ছে। তবে ভালোর তো শেষ নেই। আপনার বস হয়তো বলতে পারি, আমি প্লটেই আসল সংখ্যাও দেখতে চাই। কে কতটা জিতল সেটাও দেখান। কী আর করা! দেখিয়েই দিন। এ সুযোগে আমরা প্লটে ডেটা সোর্সটাও দেখিয়ে দেই। 




তবে এই প্লটটা আসলে বাড়াবাড়ি। তবে বস চাইলে তো আর আসলে কিছু করার নেই। বস ইজ অলওয়েজ রাইট! 

[লেখাটি উৎসর্গ করলাম সহকর্মী হাসান আহমেদকে।  ও-ই প্রথম এমন একটি গ্রাফের প্রস্তাব দিয়েছিল আমাকে।
Category: articles

Saturday, June 29, 2019

প্রথমে দেখে মনে হবে এ আর এমন কী? একঘেঁয়ে এক জোড়া সমীকরণ। অথচ চিন্তাটা কত অসাধারণ! কেন অসাধারণ তা দেখার আগে একটা-দুইটা উদাহরণ দেখে নিলে মন্দ হয় না। আপাতত আমরা খুবই সাধারণ একটা উদাহরণ দেখব।

ধরুন, আমাদের কাছে খুবই সরল একটা সমীকরণ আছে। $y = \frac{x}{2}+25 $।

একে প্যারামেট্রিক রূপ দেওয়া যাক। বিস্তারিত বলার আগে আপাতত এটা বলে রাখি, প্যারামেট্রিক সমীকরণে আমরা দুটো চলকের (Variable) সম্পর্ককে তৃতীয় অন্য আরেকটি চলক দিয়ে (সাধারণত যাকে t দিয়ে প্রকাশ করা হয়) প্রকাশ করি।

প্যারামেট্রিক করতে ধরি, $t = \frac{x}{2}$। অবশ্যই আপনি অন্য কিছুও ধরতে পারতেন। এখানে থেকে, $x =2 \times t$।

তাহলে, $y = \frac{2t}{2}+25 = t+25 $

অতএব, $y = \frac{x}{2}+25 $ সমীকরণকে প্যারামেট্রিক করে আমরা দুটো সমীকরণ পেলাম।
  • $x=2t $
  • $y = t +25 $
আমরা আরও কিছু উদাহরণ দেখব। তবে তার আগে একটু চিন্তা করি, কী লাভ হয় প্যারামেট্রিক সমীকরণ দিয়ে? 

$y = \frac{x}{2}+ 25 $ সমীকরণটা নিয়ে আবার চিন্তা করি। এটা দিয়ে $x$ ও $y$ এর সম্পর্ক বোঝানো হয়েছে। যেখানে $y$ নির্ভর করছে $x$ এর ওপর। এই সম্পর্ক নানান রকমের হতে পারে। আপাতত আমরা ধরে নিচ্ছি এখানে $x$ দ্বারা বোঝাচ্ছে একটি অফিসের জন্যে প্রতিদিন কয়টি কলম কেনা হচ্ছে। আর $y$ দ্বারা বোঝাচ্ছে কত পেইজ কাগজ লাগছে।

তাহলে, ১০টা কলম কিনলে কাগজ কেনা হবে $y=\frac{10}{2} + 25$। মানে ৩০ পেইজ।

আপাত দৃষ্টিতে দেখা যাচ্ছে, কাগজের সংখ্যা কলমের সংখ্যার ওপর নির্ভর করছে। অথচ বাস্তবে সেটা নাও হতে পারে।

হতে পারে কোনটা কতটা কেনা হবে সেটা নির্ভর করছে ঐদিন অফিসে কত জন মানুষ লেখালেখি বিষয়ক কাজ করছে তার ওপর। এই সংখ্যাকে আমরা $t$ দিয়ে প্রকাশ করতে পারি। আমরা একটু আগেই $t$ এর সাথে $x$ ও $y$ এর সম্পর্ক বের করেছি। তাহলে ধরা যাক, কোনো একদিন ঐ অফিসে ৩০ জন মানুষ কাগজে লেখালেখি করবে।

তাহলে, মোট কলম লাগবে, $x=2t$  বা $2 \times 30$, মানে ৬০টি।

আর কাগজ লাগবে $y= t +25 = 30 + 25 = 65$। মানে কাগজ লাগবে ৬৫ পেইজ।

তাহলে আমরা দেখলাম, আসলে কয়টি কলম বা কত পেইজ কাগজ কেনা হবে সেটা আসলে নির্ভর করছে তৃতীয় আরেকটি চলকের ওপর। কাগজ ও কলমের সংখ্যা একে অপরের ওপর নির্ভর নাও করতে পারে। এখানেই প্যারামেট্রিক সমীকরণের কারিশমা।

এছাড়াও উচ্চতর নানান অ্যানালাইসিসে সমীকরণকে প্যারামেট্রিক করে নিলে কাজ করতে সুবিধা হয়।

এবার আরেকটা উদাহরণ দেখা যাক।

$$x^2+y^2=16$$

এটাকে আমরা চাইলে $t=x^2$ ধরেও প্যারামেট্রিক করতে পারি। সেক্ষেত্রে সমীকরণ দুটো হবে এমন-
  • $x=\sqrt{t}$
  • $y=\sqrt{16-t}$

এছাড়া আপনি অন্য  যে-কোনো কিছু ধরেও করতে পারেন। তবে কখনও কখনও বিশেষ কিছু উপায়ে করলে সমীকরণের মানে বোঝা সহজ হয়।

ত্রিকোণমিতি থেকে আমরা জানি, $sin^2t+cos^2=1$

এখানে আমরা কোণের জন্যে $\theta$ এর বদলে $t$ ব্যবহার করলাম। যেহেতু প্যারামেট্রিক সমীকরণে সাধারণত $t$ ব্যবহার করা হয়।

এখন আমরা চাইলে $x^2+y^2=16$ কে $sin^2t+cos^2=1$ এর মতো রূপ দিতে পারি। এভাবে-

$$\frac{x^2}{16}+\frac{y^2}{16} = 1 $$
এটা থেকে-
$$(\frac{x}{4})^2 + (\frac{y}{4})^2=1$$

এটাকে এখন $sin^2t+cos^2=1$ এর মতো দেখাচ্ছে। তাহলে আমরা লিখতে পারি,

$\frac{x}{4}=sint$ এবং $\frac{y}{4}=cost$

মানে,
  •     $x=4 \space sint$
  •     $y=4 \space cost$
দেখেই বোঝা যাচ্ছে, এটা ৪ একক ব্যাসার্ধের একটি বৃত্ত। এখানে ৪ এর জায়গায় ১ থাকলে এটা হত  একক বৃত্ত (unit circle)। মানে ব্যাসার্ধ ১ এককের বৃত্ত।

দুই জায়গায়ই ৪ না হয়ে কম বেশি হলে এটা হয়ে যেত উপবৃত্তের  (ellipse) সমীকরণ। যেমন

  •     $x=3 \space cost$
  •     $y=2 \space sint$
    আমরা দুটি চিত্রই এঁকে দেখতে পারি। আঁকব অবশ্যই R দিয়ে

    প্রথমে উপবৃত্ত দেখা যাক।



    চিত্র-০১ঃ প্যারামেট্রিক সমীকরণ থেকে আঁকা উপবৃত্ত

    এবার তাহলে বৃত্তটাও এঁকে ফেলি।



    চিত্র-০২ঃ প্যারামেট্রিক সমীকরণ থেকে আঁকা বৃত্ত 

    বলাই বাহুল্য, এভাবে আঁকাআঁকির জন্যে প্যারামেট্রিক সমীকরণ ব্যবহার না করলে মুশকিলে পড়তে হয় অনেক সময়।

    এর আগে একটি লেখায় আমরা দারুণ দারুণ নকশার ডিজাইন দেখেছিলাম। ওখানেও কিন্তু প্যারামেট্রিক সমীকরণ কাজে লাগানো হয়েছিল।

    এভাবেই প্যারামেট্রিক সমীকরণ আমাদের জীবনকে সহজ করে তোলে। নান্দনিকও কি নয়? (কী নান্দনিক, তাই না?)। এমন সুন্দর সুন্দর ডিজাইন তো সে কথাই বলে। পাশাপাশি আমাদেরকে ভিন্ন দৃষ্টিকোণ থেকে চিন্তা করতে শেখায়।

    সূত্র
    ১। বেটার এক্সপ্লেইন্ড
    ২। খান অ্যাকাডেমি
    ৩। Straighter Line
    ৪। MrsDobbsMath
    ৫। উইকিপিডিয়া
    Category: articles

    Friday, April 26, 2019

    বেইজ R দিয়েও সহজেই দুই ধরনের বার চার্টই আঁকা যায়। তবে ggplot2 দিয়ে আকাঁ চার্টের দিকে তাকিয়ে থাকতে ইচ্ছে করবে। আজ আমরা নীচের বার চার্টটি আঁকব।

    এটাই আঁকব। তবে ধাপে ধাপে দেখা যাক।

    ও আচ্ছা। এই লেখায় আমরা gcookbook প্যাকেজের ডেটা ব্যবহার করব। তাই, ভালো হয় প্যাকেজটি ইনস্টল ও লোড করে নিন।
    install.packages("gcookbook")
    library(gcookbook)
    এই প্যাকেজের cabbage_exp ডেটা ব্যবহার করব। আপনি Rstudio ব্যবহার না করে থাকলে এই ডেটা লোড করে নিন। data(cabbage_exp) কমান্ড দিয়ে। 

    এবার আকাঁ শুরু করা যাক। 
    ggplot(cabbage_exp,aes(x=Date, y=Weight, fill=Cultivar))+
      geom_bar(position = "dodge", stat = "identity")+
      ggtitle("Grouped Bar Chart of Weight by Cultivar")
    এখানে position = "dodge" দেওয়াতে বারগুলো পাশাপাশি বসেছে। এটাই গ্রুপড বার চার্ট করার কমান্ড। স্ট্যাকড বার তৈরি করতে হলে এখানে দিতে হবে "stack"। আর stat = "identity" দিতে হয়েছে, কারণ cabbage_exp ডেটায় weight এর মানগুলো সরাসরি দেওয়া আছে। এভাবে না থেকে ধরুন এভাবে থাকল, "Male", "Male", "Female", "Male", "Female"। এখান থেকে Rকে হিসবে করে নিতে হত কোন গ্রুপে কয়টা আছে। সেক্ষেত্রে আমরা দিতাম stat="count"। অবশ্য এই অপশনটা ডিফল্ট কাজ করে বলে কিছুই না দিলেও চলবে। 

    এবার আমরা কিছু অপশন পাল্টে দেখি। 
    • আমরা গ্রুপড না করে স্ট্যাকড বার আঁকব। position = "stack"
    • অটো কালারে বদলে RColorBrewer প্যাকেজ দিয়ে কালার দেব। আরও দেখুন এখানে
    ggplot(cabbage_exp,aes(x=Date, y=Weight, fill=Cultivar))+
      geom_bar(position = "stack", stat = "identity")+
      scale_fill_brewer(palette = "Paired")+
      ggtitle("Grouped Bar Chart of Weight by Cultivar")
    এবার আমরা 
    • বারের সাথে প্রতি বারের মান দেখাব। 
    • আমরা বারগুলো খাড়া না রেখে অনুভূমিক করে দেব। এজন্য বাড়তি কোড: coord_flip()
    • এক্ষেত্রে স্ট্যাকড এর চেয়ে গ্রুপড বার ভাল দেখায় বলে আমরা আবারও position="dodge" ব্যবহার করব। 
    ggplot(cabbage_exp,aes(x=Date, y=Weight, fill=Cultivar))+
      geom_bar(position = "dodge", stat = "identity")+
      scale_fill_brewer(palette = "Paired")+
      geom_text(aes(label=Weight), vjust=1.5, colour="black",
                position=position_dodge(0.9), size=4)+
      coord_flip()+
      ggtitle("Grouped Bar Chart of Weight by Cultivar")

    আমরা পেয়ে গেলাম কাঙ্খিত চার্ট। সরল বার চার্ট আঁকার কৌশল দেখে নিন এখানে

    পুনশ্চ: dplyr বা magrittr প্যাকেজ লোড করা থাকলে ggplot(cabbage_exp,aes অংশটুকুকে আরও সহজ করেও লেখা যায়।

    cabbage_exp %>% ggplot(aes(...

    %>% কে বলা হই পাইপ অপারেটর। dplyr প্যাকেজে এটার ব্যবহার খুব দারুণ। 
    Category: articles

    Thursday, April 25, 2019

    নান্দনিক গ্রাফের জন্য ggplot2 ব্যবহার না করলে জীবনটাই বৃথা। সাথে যদি RColorBrewer যুক্ত হয় তাহলে তো সোনায় সোহাগা। কথা কম বলে কাজে নেমে পড়ি।

    এটাই আমরা শেষে দেখব 
    ইনস্টল করা না থাকলে install.packages("ggplot2") দিয়ে ও একইভাবে RColorBrewer ইনস্টল করে নিন। এবার প্যাকেজ দুটি লোড করে নেই। মনে রাখবেন, লোড করার সময় কোটেশন দিতে হবে না।
    library(ggplot2)
    library(RColorBrewer)
    এবার এঁকে ফেলি। মনে রাখতে হবে, ggplot2 প্যাকেজ ভেক্টরের বদলে ডেটাফ্রেইম নিয়ে কাজ করে। এখানে আমরা ggplot2 এর বিল্ট-ইন ডেটাসেট diamonds ব্যবহার করব। প্রথমে আমরা RColorBrewer ছাড়া এঁকে দেখি। 
    ggplot(diamonds, aes(cut))+
      geom_bar(fill="blue")+
      labs(title="Diamonds Quality Bar Plot")

    এখানে blue কালার দিলাম। এবার দেখা যাক RColorBrewer কীভাবে একে আরও আকর্ষণীয় করে।
    ggplot(diamonds, aes(cut))+
      geom_bar(fill=brewer.pal(n=9, name='GnBu')[9:5])+
      labs(title="Diamonds Quality Bar Plot")
    এখানে brewer.pal কীভাবে কাজ করে বুঝতে অসুবিধা হলে এখান থেকে প্লট কালারিং এর উপায়গুলো দেখে নিন। বর্ণিত ৯টি উপায়ের মধ্যে ৯ নম্বরটি দেখতে হবে। 

    দুই প্যাকেজের সমন্বয় 
    তবে একটি সমস্যা হয় অনেক সময়। RColorBrewer এর কালারের ৩ সেট কম্বিনেশন আছে। পুরো লিস্ট দেখতে পারেন এখানে। এগুলোর মধ্যে সর্বোচ্চ ১২টি পর্যন্ত কালার আছে। আমাদের বার চার্টের বার আরও বেশি হয়ে গেলেই R-এ error দেখায়। 

    এটার সমাধানও সোজা। আগে থেকে কালার বানিয়ে রেখে দিলে সুবিধা। 
    col <- brewer.pal(9, "Spectral")
    আপনি চাইল Spectral এর বদলে অন্য প্যালেটও দিতে পারেন। লিঙ্কটা থেকে দেখে নিলেই হলো। এবার অনেকটা আগের মতোই। শুধু একটি পার্থক্য। colorRampPalette ফাংশনের ভেতরে প্যালেটকে দিয়ে দিতে হবে। 

    ও আচ্ছা। কালার যেহেতু ১২টার বেশি হলে সমস্যা হবে, তাই আগেই ১২টার বেশি বার হবে এমন একটি ডেটা বানিয়ে নেই। 
    df <- data.frame(x=sample(15, 1000, replace = T))
    এবার শুধু আঁকা বাকি। 
    ggplot(df, aes(x))+
      geom_bar(fill=colorRampPalette(col)(15))+
      coord_flip()
    এটাই উপরে দেখানো গ্রাফটা। বিভিন্ন কালার কম্বিনেশন দিয়ে পাল্টে নিন চেহারা! আপনি চাইলেয়াগে থেকে না বানিয়ে রেখে একবারেও বসিয়ে দিতে পারেন। কেউ কিছু মনে করবে না।
    ggplot(df, aes(x))+
      geom_bar(fill=colorRampPalette(brewer.pal(8, "GnBu"))(15))+
      coord_flip()
    সূত্রঃ
    ১। R graph gallery
    Category: articles

    Sunday, January 6, 2019

    হুম, আমরা নীচের চিত্রটিই আঁকতে চাই। এতে প্রয়োজন হবে R এর অন্যতম জনপ্রিয় প্যাকেজ ggplot2। হ্যাঁ, প্যাকেজ ছাড়াই আপনি এমন গ্রাফ আঁকতে পারেন। তবে দেখতে সেটা এতটা দৃষ্টিনন্দন নাও হতে পারে।

    R প্রোগ্রামিং প্যাকেজ ggplot2 এর কারসাজি 

    তাহলে প্যাকেজটি না থাকলে ইনস্টল করে নিন। library ফাংশন দিয়ে লোড করতেও ভুলবেন না কিন্তু!
    install.packages("ggplot2")
    library(ggplot2)

    বরাবরের মতোই আগে একটি ডেটা লাগবে। বানিয়ে নেই তাহলে। 
    x <- sample(10)
    y <- sample(10)
    z <- sample(10)

    তবে এটাকে ggplot2 পরিচ্ছন্ন (tidy) ডেটা বলতে রাজি না। তাহলে ডেটাকে পরিশুদ্ধ করে নেই। পরিচ্ছন্ন ডেটা সম্পর্কে আরও জানতে এই লিঙ্কটা ঘুরে আসুন। রেফারেন্সে থাকা লিঙ্কগুলোয়ও ঢুঁ মেরে আসতে পারেন। 
    যাই হোক, পরিচ্ছন্ন হবে এভাবে:
    dt <- data.frame(var=rep(c("x","y","z"), each=10), val=c(x,y,z),
                     crit=1:10)

    উল্লেখ্য, এটা আমি নিজের মতো করে বানিয়েছি। tidy করার ফর্মাল উপায়ের জন্যে tidy প্যাকেজে gather নামে একটা ফাংশন আছে। আপনার ইচ্ছা আপনি কীভাবে করবেন। নিয়ম মেনে করাই ভাল। যাই হোক, সামনে যাওয়া যাক। বড় কোড দেখে ঘাবড়াবেন না! কোডের শেষের তিন লাইনই অপশনাল। করলে ভালো, না করলে নাই। 

    ggplot(data=dt, aes(crit, val, color=var))+
      geom_line()+geom_point(size=2)+
      xlab("Criteria")+
      ylab("Value")+
      ggtitle("My title")

    আমরা পেয়ে গেলাম উপরের গ্রাফের মতো গ্রাফ। 

    চাইলে কাজটি আপনি ggplot2 ব্যবহার না করেও করতেই পারেন। এর আগে আমরা টাইম সিরিজ ডেটার জন্যে এমন গ্রাফ দেখেছিও। তবে এবার দেখব যে-কোনো রকম ডেটার জন্যে। 

    ধরে নিলাম আগের x, y, z চলক তিনটা স্টোর করা আছে। 

    এবার আগে তিনটা কালার বানিয়ে রেখে দেই। 
    col <- c("blue", "black", "green4")
    এবার একে একে তিনটা চলক প্লট করা:
    plot(x, col=col[1], pch=19, xlab="Some text", ylab="other text")
    lines(x, col=col[1])
    points(y, col=col[2], pch=15)
    lines(y, col=col[2])
    points(z, col=col[3], pch=18)
    lines(z, col=col[3])
    legend("topright", legend=c("x", "y", "z"), col=col, pch=c(19,15,18),
           ncol=3)

    পাওয়া গেল গ্রাফখানি
    বেইজ R দিয়ে মাল্টিপল লাইন প্লটিং। বড় করে দেখতে ক্লিক করুন এখানে
    এই কোডটিকে নানানভাবে কাস্টোমাইজ করে প্লট আরও সুন্দর করে নিতে পারেন। তবে আমার মতে ggplot-ই ভালো। নিজে নিজে সব করতে গেলেই ঝামেলা বাঁধে। আমার খুব প্রিয় একটা কথা হলো:
    Category: articles

    Tuesday, July 17, 2018

    R-এ অধিকাংশ কাজই একাধিক উপায়ে করা যায়। নান্দনিক গ্রাফিক্সের জন্য কালার বড় ভূমিকা পালন করে। R-এ প্লট কালার করা যায় অন্তত ৯ উপায়ে। চলুন জেনে নেওয়া যাক সে উপায়গুলো।

    ও, আচ্ছা। প্লট করার জন্যে তো হাতে কিছু ডেটা লাগবে। আগে ডেটা বানিয়ে নিই তাহলে।

    x=rexp(1000)
    y=(rnorm(1000)

    আর R এর ডিফল্ট ফন্ট আমার পছন্দ না। তাই ফন্টটা একটু পালটে নিচ্ছি। এটা অপশনাল। না করলেও দুনিয়া ধ্বংস হয়ে যাবে না।

    par(family="serif")

    তাহলে এবার আসল কাজে আসা যাক! মনে রাখতে হবে R-এ কমেন্ট শুরু হয় # চিহ্ন দিয়ে। মানে # চিহ্নের পরের কোড রান হবে না। 

    ১। কালার সিকুয়েন্স 

    plot(x, y, col=4, pch=16, cex=1.4, main="Scatter Plot",
         xlab="X values", ylab="Y values")
    grid() # optional

    এখানে plot ফাংশনের col ছাড়া বাকি আর্গুমেন্টগুলো অপশনাল। প্লটের নান্দনিকতার স্বার্থেই যোগ করা। যাই হোক, এখানে খেয়াল করুন, আমরা শুধু একটি সংখ্যা বসিয়ে দিয়েছি। R-এ প্রায় প্রতিটি সংখ্যার বিপরীতে একটি করে কালার আছে। আপনি চাইলে এখানে 4,5,10, 25, 36- যাই ইচ্ছে বসিয়ে দেখতে পারেন। 

    আবার কখনও একই সাথে অনেকগুলো কালারের প্রয়োজন হলে col=1:10 বা c(1,2,4,6,7,3) ফরম্যাটেও লিখতে পারেন। চেক করেই দেখুন না!

    আবারও মনে করিয়ে দেই। উপরের grid কমান্ডটি কিন্তু অপশনাল। এটা আসলে প্লটে বক্স আঁকে। # দিয়ে অপশনাল কথাটা বলা আছে।

    ২। কালার নেইম 

    এক্ষেত্রে আমরা সরাসরি কালারের ইংরেজি (সাধারণত) নাম বসিয়ে দেব।

    plot(x, y, col="blue", pch=16, cex=1.4, main="Scatter Plot",
         xlab="X values", ylab="Y values")

    একই প্লট পাওয়া গেল। এখানেও চাইলে আপনি একাধিক কালার ব্যবহার করতে পারেন একই প্লটে। Scatter প্লটের ক্ষেত্রে একাধিক কালার আপাতত দরকার না হলেও হিস্টোগ্রামে দরকার হতে পারে। যেমনঃ
    hist(x, col=c("blue", "grey"))
    box() #optional
    grid() #optional
    এক্ষেত্রে যেটা দরকার, তা হলো সবগুলো কালারের নাম জানা। সেটাও সহজ। প্রথমত, এই লিঙ্ক থেকে R-এর সবগুলো কালার নেইম পাবেন। অফলাইনে ব্যবহার করতে ডাউনলোড করে নিতে পারেন। আরও সহজে নামগুলো দেখতে চাইলে colors() কোড ব্যবহার করুন। তবে এক্ষেত্রে কোন কালারের চেহারা কেমন সেটা বোঝা যাবে না। সেটা বোঝা যাবে পিডিএফ ফাইলটা থেকে (লিঙ্কের)।

    ৩। অটো কালার ১ (topo.colors(10))
    hist(y, col=topo.colors(10))
    grid() #optional
    box() #optional

    যতটা আলাদা কালার চাই, ব্র্যাকেটের ভেতরে সেটা উল্লেখ করে দিতে হবে। 

    ৪। অটো কালার ২
    hist(x, col=heat.colors(12))
    grid() #optional
    box() #optional

    এক্ষেত্রেও যতটা আলাদা কালার চাই, ব্র্যাকেটের ভেতরে সেটা উল্লেখ করে দিতে হবে। 

    ৫। অটো কালার ৩
    hist(x, col=terrain.colors(3))
    grid() #optional
    box()#optional
    এক্ষেত্রেও যতটা আলাদা কালার চাই, ব্র্যাকেটের ভেতরে সেটা উল্লেখ করে দিতে হবে। 

    ৬। হেক্সাডেসিমাল কোড

    এই সাইট ভিজিট করুন। অথবা hexadecimal colors লিখে সার্চ দিলে আরও নানান সাইট পাওয়া যাবে। এখান থেকে হেক্সাডেসিমাল কোডটি বা কোডগুলো বসিয়ে দিতে পারেন। 
    hist(x, col="#80ff00")
    grid() #optional
    box()#optional

    ৭,৮। Rgb ও hsl কালার কোড

    উপরে দেওয়া লিঙ্কেই বাকি দুটি কালার কোডও পাবেন। এ দুটোতে সামান্য জটিলতা আছে। লিঙ্কে যেভাবে আছে ঠিক সেভাবে দিলে হবে না। rgb() ফাংশনের ভেতরে ৩টি সংখ্যা দিতে হবে। rgb মানে আসলে রেড, গ্রিন ও ব্লু। অতএব, ভেতরে যথাক্রমে লাল, সবুজ ও নীলের অনুপাত বসাতে হবে। প্রতিটি সংখ্যা হবে ০ থেকে ১ এর মধ্যে। ০ ও ১ দেওয়া যাবে। 

    hist(x, col=rgb(0,0.8,0.9))
    grid() #optional
    box()#optional

    আর hsl কোডে আরেকটু জটিলতা আছে। এটাকে ব্যবহার করতে চাইলে এই টিউটোরিয়াল পড়ুন। 

    ৯। সেরা কৌশল 

    এতক্ষণ যেগুলো বললাম এগুলোর অনেকগুলো থেকেই অনেক সময় সেরা কম্বিনেশন বাছাই করা কঠিন। যেমন নীচের ম্যাপটি আঁকতে চাই। ম্যাপটি আঁকার বিস্তারিত কোড আছে এখানে। 

    spplot(zilla, "literacy",col.regions=terrain.colors(5),
           cuts=4, col='transparent', main='Sample Map',
           scales=list(draw=T))

    এখানে terrain.colors(5) ভালো কাজ করেছে। তবে কালারের সিকুয়েন্স ধরে রাখতে পারেনি। 

    কিন্তু এটায় দেখুন, মান বাড়ার সাথে কালার গাঢ় হয়েছে। অথবা নীচের হিস্টোগ্রাম দেখুনঃ
    নানান ক্ষেত্রেই এটার প্রয়োজন অনুভব করবেন। এক্ষেত্রে একটি প্যাকেজ লাগবে। নাম RColorBrewer। ইন্সটল করে লোড করে নিন। 

    install.packages("RColorBrewer")
    library(RColorBrewer)

    এবার আবার হিস্টোগ্রাম আঁকি। 
    hist(x, col=brewer.pal(n=5, name='YlGn'), ylim=c(0,500))

    এখানে n এর জায়গায় যতগুলো কালার চান সেটা বসাবেন। আর name এর জায়গায় কী বসাবেন সেটার উপরই বির্ভর করছে কালার কেমন হবে। নীচের ছবিতে দেখে নিন কোডগুলো। বড় করে দেখতে এখানে ক্লিক করুন। 

     

    আপনাকে আর পায় কে। দৃষ্টিনন্দন প্লট এঁকে তাক লাগিয়ে দিন বসকে!

    এর বাইরে আপনি আরও কিছু জানলে কমেন্টে অবশ্যই জানাবেন।
    Category: articles

    Thursday, June 7, 2018

    R এর গ্রাফগুলোতে এমনিতে গ্রিড থাকে না। কিন্তু চাইলে করা যাবে না, এমন কিছু R-এ খুঁজে পাওয়া দুষ্কর। আমরা আজকে নীচের গ্রাফটি আঁকার উপায় দেখব।


    বরাবরের মতোই আগে লাগবে ডেটা। তো কিছু ডেটা বানিয়ে নেই। 

    x=sample(30)+1:30
    y=sample(30)+30:1
    df=data.frame(x,y)
    df.ts=ts(df,start=1980)

    একটি টাইম সিরিজ ফরম্যাট বানিয়ে নিলাম। এবার চাইলে প্লটের ব্যাকগ্রাউন্ড সেট করে নিতে পারি। না করলেও দুনিয়া ধ্বংস হয়ে যাবে না। আপনার ইচ্ছা! 

    par(bg="#8FBC8F")

    এখানে #8FBC8F হলো হেক্স কোডে লেখা কালার। আপনি এ সাইট থেকে আরও নানান ধরনের কালার বসাতে পারেন। চাইলে আপনি red, blue ইত্যাদিও দিতে পারেন। 

    x ও y চলকে বসানোর জন্য দুই রকম কালার ঠিক করে রাখি। 

    color= c("red","yellow")

    এবার প্রাথমিক প্লটখানা এঁকে ফেলি। এতে কিন্তু কোনো গ্রিড নেই। 

    ts.plot(df.ts, gpars=list(col=color), lwd=5,
            ylab="Value", xlab="Year", main="Grid on R plot")

    এবারই আমাদের মূল কাজ। মানে গ্রিড। 

    grid(7,7, col="black", lwd=3, lty='solid')

    7, 7 বোঝাচ্ছে যে x ও y অক্ষ বরাবর যথাক্রমে কয়টি করে লাইন আঁকা হবে। লাইনের রঙ, লাইনের প্রস্থ সবই চেঞ্জ করতে পারবেন ইচ্ছা মতো। 

    আরও নানান উপায় দেখতে হেল্প ফাইল দেখে নিন। 

    ?grid

    এবার প্লটে লিজেন্ড দিয়ে বুঝিয়ে দেওয়া যাক কোন লাইনটা কোন চলকের। 

    legend("top", legend=names(df), ncol=2, col=color, pch=19)
    তবে সবচেয়ে ভালো grid() ফাংশনের ভেতরে কিছুই না লিখলে। এতে করে y অক্ষের সাথে দাগগুলো নিজে নিজেই মিলে যাবে। দেখতে ও বুঝতেও হবে সহজ। অবশ্য প্লট ব্যাকগ্রাউন্ড সেট করলে কালার ম্যাচিং না হলে কালার যুক্ত করা যেতে পারে।

    par(bg="#00bfff")
    plot(sample(10,6), pch=19, col="white", type="b", lwd=2,
         ylab="Value")
    grid()

    এটায় কালার মিলছে না। তাই গ্রিডের কালার দিয়ে দিলাম।

    par(bg="#00bfff")
    plot(sample(10,6), pch=19, col="white", type="b", lwd=2,
         ylab="Value")
    grid(col="black")

    R প্লটে অটো গ্রিড 
    এখানে আমরা প্লট করার জন্য ১০টি ভ্যালু থেকে ৬টি ভ্যালু স্যাম্পল নিয়েছি। তাই একই কোড রান করলেও গ্রাফটি এটা থেকে আলাদা আসার সম্ভাবনাই বেশি।

    আরও পড়ুন 
    ☛  স্মুথ প্লট আঁকবেন কীভাবে 
    Category: articles

    Wednesday, May 9, 2018

    R এ আঁকা গ্রাফগুলো সাধারণত একটু এবড়োথেবড়ো হয়। অনেক সময়ই দেখতে অতটা সুন্দর হয় না। যেমন এই গ্রাফটি দেখুন।

    R প্রোগ্রামিং: টাইম সিরিজ গ্রাফ 

    এই ছবিটা কিছুটা এবড়োথেবড়ো। অনেক সময় আরও অনেক বেশি এবড়োথেবড়োও হয়।

    সামান্য কিছু কোড করেই একে অনেকটা উন্নত করে নেওয়া যায়।
    png(filename="output.png", type="cairo")
    #see ?png for more detail
    # Code to plot
    dev.off()

    filename অংশে আপনি যে লোকশনে সেভ করতে চান, সেটা ও ফাইলের নাম উল্লেখ করবেন। উপরের কোডে output নামে একটি png ফাইলে ছবিটা সেভ হবে। আর এটা সেভ হবে আপনার working directory তে। আপনার বর্তমান ওয়ার্কিং ডিরেক্টরি দেখুন।

    getwd()

    চাইলে আবার পাল্টেও নিতে পারেন।
    setwd("D:/R")

    উদাহরণ

    আমরা নীচের বানানো ডেটা ব্যবহার করব।
    x=seq(30000,40000,500)+rnorm(mean=500, sd=1000,n=21)
    y=seq(29000,39000,500)+rnorm(mean=500, sd=1000,n=21)
    z=x-y
    df=data.frame(income=x, expense=y, balance=z
    df.ts=ts(df, end=2018)

    এবার smooth করার জন্য কাজ। এখানে par(bg="gray") অংশটি অপশনাল। ব্যাকগ্রাউন্ড সেট করার জন্য বসানো হয়েছে।

    png(filename="myplot.png", type="cairo")
    par(bg="gray")
    ts.plot(df.ts, gpars=list(col=topo.colors(3)), lwd=5, ylab="Amount", xlab="Year", main="Smooth R plot")
    legend("topleft", legend=names(df), fill=topo.colors(3), ncol=3,)
    dev.off()

    উপরের ছবিটাই এখন মসৃণ হয়ে এমন হয়ে যাবে।

    smooth R প্লট
    আরও পড়ুন 
    Category: articles