Ggplot2 বার গ্রাফে বারগুলি অর্ডার করুন


300

আমি একটি বার গ্রাফ তৈরি করার চেষ্টা করছি যেখানে বৃহত্তম বারটি y অক্ষের নিকটবর্তী এবং সবচেয়ে কমতম বারটি সবচেয়ে দীর্ঘতম হবে। সুতরাং এটি আমার মতো টেবিলের মতো

    Name   Position
1   James  Goalkeeper
2   Frank  Goalkeeper
3   Jean   Defense
4   Steve  Defense
5   John   Defense
6   Tim    Striker

সুতরাং আমি একটি বার গ্রাফ তৈরির চেষ্টা করছি যা পজিশন অনুসারে খেলোয়াড়ের সংখ্যা প্রদর্শন করবে

p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)

তবে গ্রাফটি গোলরক্ষক বারটি প্রথমে প্রতিরক্ষা এবং অবশেষে স্ট্রাইকারকে দেখায়। আমি গ্রাফটি অর্ডার করার জন্য চাই যাতে প্রতিরক্ষা বারটি y অক্ষের নিকটবর্তী হয়, গোলরক্ষক এবং অবশেষে স্ট্রাইকারটি। ধন্যবাদ


12
টেবিলটি (বা ডেটাফ্রেম) নিয়ে গণ্ডগোল না করে ggplot আপনার জন্য এগুলিকে পুনঃক্রম করতে পারে না?
tumultous_rooster

1
@ ম্যাটোব্রায়ান আমি অবিশ্বাস্য মনে করি যে এটি একটি একক, সাধারণ কমান্ডে করা হয়নি
ইউলার_সাল্টার

@ জিমানো খুব খারাপ যে আপনি আমার মন্তব্যটি থেকে তা পেয়ে যাচ্ছেন। আমার পর্যবেক্ষণটি ggplot2
ওপেনের

2
@ এলার_সাল্টার স্পষ্ট করে দেওয়ার জন্য আপনাকে ধন্যবাদ, আপনার মত ঝাঁপিয়ে পড়ার জন্য আমার আন্তরিক ক্ষমা। আমি আমার মূল মন্তব্যটি মুছে ফেলেছি।
জিমানো

উত্তর:


213

অর্ডার সহ কীটি হ'ল আপনার যে ক্রমটি চান সেটি ক্রমের মাত্রা নির্ধারণ করা। একটি আদেশযুক্ত ফ্যাক্টর প্রয়োজন হয় না; অর্ডারযুক্ত ফ্যাক্টরের অতিরিক্ত তথ্য প্রয়োজনীয় নয় এবং যদি এই তথ্যগুলি কোনও পরিসংখ্যানের মডেলটিতে ব্যবহার করা হয় তবে ভুল প্যারামিট্রাইজেশনের ফলাফল হতে পারে - বহুবর্ষীয় বৈপরীত্য যেমন নামমাত্র তথ্যের জন্য সঠিক নয়।

## set the levels in order we want
theTable <- within(theTable, 
                   Position <- factor(Position, 
                                      levels=names(sort(table(Position), 
                                                        decreasing=TRUE))))
## plot
ggplot(theTable,aes(x=Position))+geom_bar(binwidth=1)

বারপ্লট ফিগার

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

theTable$Position <- factor(theTable$Position, levels = c(...))

1
@ গ্যাভিন: 2 সরলকরণ: যেহেতু আপনি ইতিমধ্যে ব্যবহার করছেন তাই ব্যবহার withinকরার দরকার নেই theTable$Positionএবং আপনি sort(-table(...))ক্রমহ্রাসমান ক্রমটি করতে পারেন ।
প্রসাদ চালশানী

2
প্রাক্তন প্রসাদকে পরীক্ষার থেকে বাঁচিয়ে রাখা হয়েছে বলে উল্লেখ করার জন্য ধন্যবাদ। যতদূর পরের কথা, আমি স্পষ্টভাবে -আপনার ব্যবহারের তুলনায় বিপরীত ধরণের জন্য জিজ্ঞাসা করতে পছন্দ করি কারণ বাকি সমস্ত decreasing = TRUEকোডটিতে লক্ষ্য না রেখে অভিপ্রায়টি অর্জন করা আরও সহজ -
গ্যাভিন সিম্পসন

2
@GavinSimpson; আমি মনে করি যে অংশটি levels(theTable$Position) <- c(...)অনাকাঙ্ক্ষিত আচরণের দিকে নিয়ে যায় যেখানে ডেটা ফ্রেমের আসল এন্ট্রিগুলি পুনরায় সাজানো হয়, এবং কেবলমাত্র ফ্যাক্টরের মাত্রা নয়। এই প্রশ্নটি দেখুন । হয়তো আপনার সেই লাইনগুলি সংশোধন করা বা অপসারণ করা উচিত?
অ্যান্টন

2
আন্তনের সাথে দৃ agree়ভাবে একমত। আমি এই প্রশ্নটি দেখেছি এবং যেখানে তারা ব্যবহার করার জন্য খারাপ পরামর্শ পেয়েছে সেখানে ঘুরে বেড়াচ্ছে levels<-। আমি সেই অংশটি সম্পাদনা করতে যাচ্ছি, কমপক্ষে অস্থায়ীভাবে।
গ্রেগর থমাস

2
@ অ্যান্টন পরামর্শের জন্য ধন্যবাদ (এবং সম্পাদনার জন্য গ্রেগরকে); আমি levels<-()আজকের মাধ্যমে কখনও এটি করব না । এটি 8 বছর আগের থেকে কিছু এবং আমি স্মরণ করতে পারি না যে জিনিসগুলি তখন ভিন্ন ছিল বা আমি কেবল সাধারণ ভুল ছিল কিনা, তবে নির্বিশেষে, এটি ভুল এবং মুছে ফেলা উচিত! ধন্যবাদ!
গ্যাভিন সিম্পসন

220

@ গ্যাভিনসিম্পসন: এটির reorderজন্য একটি শক্তিশালী এবং কার্যকর সমাধান:

ggplot(theTable,
       aes(x=reorder(Position,Position,
                     function(x)-length(x)))) +
       geom_bar()

7
প্রকৃতপক্ষে +1, এবং বিশেষত এই ক্ষেত্রে যেখানে একটি যৌক্তিক আদেশ রয়েছে যা আমরা সংখ্যাগতভাবে শোষণ করতে পারি। যদি আমরা বিভাগগুলির স্বেচ্ছাসেবী ক্রম বিবেচনা করি এবং আমরা বর্ণানুক্রমিক চাই না তবে সরাসরি প্রদর্শিত স্তরগুলি নির্দিষ্ট করা ঠিক তত সহজ (সহজ?)।
গ্যাভিন সিম্পসন

2
এটাই নেস্টেস্ট। আসল ডেটাফ্রেমটি সংশোধন করার প্রয়োজনীয়তা বাতিল করুন
টি.ফং

লাভলী, কেবল লক্ষ্য করেছেন যে আপনি এটি আরও দৃ suc়তার সাথে করতে পারেন, আপনি যদি চান সমস্ত দৈর্ঘ্য ফাংশন অনুসারে অর্ডার করা এবং আরোহণের আদেশটি ঠিক থাকে, যা আমি প্রায়শই করতে চাই:ggplot(theTable,aes(x=reorder(Position,Position,length))+geom_bar()
পোস্টাইলেম

145

scale_x_discrete (limits = ...)বারের ক্রম নির্দিষ্ট করতে ব্যবহার করে।

positions <- c("Goalkeeper", "Defense", "Striker")
p <- ggplot(theTable, aes(x = Position)) + scale_x_discrete(limits = positions)

12
আপনার সমাধানটি আমার পরিস্থিতির পক্ষে সবচেয়ে উপযুক্ত, কারণ আমি এক্সকে ডেটা.ফ্রেমে ভেরিয়েবল দ্বারা প্রকাশ করা একটি স্বেচ্ছাসেবী কলাম হিসাবে প্লট করার প্রোগ্রাম করতে চাই। অন্যান্য পরামর্শগুলি ভেরিয়েবলের সাথে জড়িত একটি এক্সপ্রেশন দ্বারা এক্স ক্রমের বিন্যাসটি প্রকাশ করা শক্ত হবে। ধন্যবাদ! যদি আগ্রহ থাকে তবে আমি আপনার পরামর্শটি ব্যবহার করে আমার সমাধানটি ভাগ করতে পারি। মাত্র একটি সমস্যা, স্কেল_এক্স_ডিসক্রিট (সীমা = ...) যুক্ত করে আমি দেখতে পেলাম যে চার্টের ডানদিকে বার-চার্টের মতো প্রশস্ত ফাঁকা জায়গা রয়েছে। আমি কীভাবে ফাঁকা জায়গা থেকে মুক্তি পেতে পারি? যেহেতু এটি কোনও উদ্দেশ্য করে না।
ইউ শেন

হিস্টোগ্রাম বারগুলি অর্ডার করার জন্য এটি প্রয়োজনীয় বলে মনে হচ্ছে
ভূগোলিক

9
কিউবিন: বাহ ... অন্যান্য উত্তরগুলি এখানে কাজ করে তবে আপনার উত্তরটি এখন পর্যন্ত খুব সংক্ষিপ্ত এবং মার্জিত বলে মনে হয় না, তবে জিপিপ্লটের কাঠামোর মধ্যে থেকে চিন্তা করার সময় সর্বাধিক সুস্পষ্ট। ধন্যবাদ.
ড্যান এনগুইন

আমি যখন এই সমাধানটি চেষ্টা করেছি তখন আমার ডেটাতে এটি এনএ গ্রাফ দেয়নি। এই সমাধানটি ব্যবহার করার কোনও উপায় আছে এবং এটিতে এনএ গ্রাফ রয়েছে?
ব্যবহারকারীর 2460499

এটি একটি মার্জিত এবং সহজ সমাধান - আপনাকে ধন্যবাদ !!
কালিফ ভন

91

আমি মনে করি ইতিমধ্যে সরবরাহিত সমাধানগুলি অত্যধিক ভার্জোজ। জিপিপ্লাট সহ ফ্রিকোয়েন্সি বাছাই করা বারপ্লট করার আরও সংক্ষিপ্ত উপায়

ggplot(theTable, aes(x=reorder(Position, -table(Position)[Position]))) + geom_bar()

এটি অ্যালেক্স ব্রাউনের পরামর্শ মতো, তবে কিছুটা সংক্ষিপ্ত এবং কোনও ফাংশন সংজ্ঞা ছাড়াই কাজ করে।

হালনাগাদ

আমি মনে করি আমার পুরানো সমাধানের সময়টি ভাল ছিল তবে আজকাল আমি বরং ব্যবহার করব forcats::fct_infreqযা ফ্রিকোয়েন্সি অনুসারে ফ্যাক্টরের স্তরগুলি বাছাই করা হয়:

require(forcats)

ggplot(theTable, aes(fct_infreq(Position))) + geom_bar()

ফাংশনটি পুনঃক্রম করার জন্য দ্বিতীয় যুক্তিটি আমি বুঝতে পারি না এবং এটি কী করে। কী ঘটছে তা দয়া করে ব্যাখ্যা করতে পারবেন?
ব্যবহারকারী 3282777

1
@ user3282777 আপনি ডক্স চেষ্টা করেছি stat.ethz.ch/R-manual/R-devel/library/stats/html/... ?
হলগার ব্র্যান্ডেল

1
দুর্দান্ত সমাধান! অন্যরা পরিপাটি সমাধানগুলি নিযুক্ত করে দেখে ভাল!
মাইকে

29

ভালো লেগেছে reorder()অ্যালেক্স ব্রাউন এর উত্তরে, আমরা ব্যবহার করতে পারেforcats::fct_reorder() । এটি মূলত একটি নির্দিষ্ট ফাংশন প্রয়োগ করার পরে ২ য় আর্গের মান অনুসারে 1 ম আর্জে নির্দিষ্ট ফ্যাক্টরগুলি সাজিয়ে রাখবে (ডিফল্ট = মিডিয়ান, যা আমরা এখানে ফ্যাক্টর স্তর হিসাবে কেবল একটি মান হিসাবে ব্যবহার করি)।

এটি লজ্জার বিষয় যে ওপি-র প্রশ্নের মধ্যে, প্রয়োজনীয় ক্রমটিও বর্ণানুক্রমিক কারণ এটি যখন আপনি কারণগুলি তৈরি করেন তখন এটি পূর্বনির্ধারিত ক্রম হিসাবে থাকে, সুতরাং এই ফাংশনটি আসলে কী করছে তা লুকিয়ে রাখবে। আরও স্পষ্ট করার জন্য, আমি "গোলকিপার" কে "জোলকিপার" দিয়ে প্রতিস্থাপন করব।

library(tidyverse)
library(forcats)

theTable <- data.frame(
                Name = c('James', 'Frank', 'Jean', 'Steve', 'John', 'Tim'),
                Position = c('Zoalkeeper', 'Zoalkeeper', 'Defense',
                             'Defense', 'Defense', 'Striker'))

theTable %>%
    count(Position) %>%
    mutate(Position = fct_reorder(Position, n, .desc = TRUE)) %>%
    ggplot(aes(x = Position, y = n)) + geom_bar(stat = 'identity')

এখানে চিত্র বর্ণনা লিখুন


1
আইএমএইচও-র সেরা সমাধানটি forcats পাশাপাশি dplyr একটি পরিপাটি প্যাকেজ।
c0bra

জোয়ালকিপারের জন্য থাম্বস আপ করুন
ওটওয়টম

23

ফ্যাক্টরগুলির একটি সাধারণ dplyr ভিত্তিক পুনর্বিন্যাস এই সমস্যাটি সমাধান করতে পারে:

library(dplyr)

#reorder the table and reset the factor to that ordering
theTable %>%
  group_by(Position) %>%                              # calculate the counts
  summarize(counts = n()) %>%
  arrange(-counts) %>%                                # sort by counts
  mutate(Position = factor(Position, Position)) %>%   # reset factor
  ggplot(aes(x=Position, y=counts)) +                 # plot 
    geom_bar(stat="identity")                         # plot histogram

19

আপনাকে কেবল Positionকলামটি একটি ক্রমযুক্ত ফ্যাক্টর হিসাবে নির্দিষ্ট করতে হবে যেখানে স্তরগুলি তাদের গণনা অনুসারে অর্ডার করা হয়েছে:

theTable <- transform( theTable,
       Position = ordered(Position, levels = names( sort(-table(Position)))))

(দ্রষ্টব্য যে কলামটির table(Position)ফ্রিকোয়েন্সি-গণনা উত্পাদন করে Position))

তারপরে আপনার ggplotফাংশনটি গণনার ক্রম হ্রাসে বারগুলি প্রদর্শন করবে। geom_barস্পষ্টভাবে অর্ডারযুক্ত ফ্যাক্টর তৈরি না করে এটি করার কোনও বিকল্প আছে কিনা তা আমি জানি না ।


আমি আপনার কোডটি এখানে পুরোপুরি বিশ্লেষণ করিনি, তবে আমি নিশ্চিত reorder()যে পরিসংখ্যান লাইব্রেরি একই কাজটি সম্পাদন করে।
চেজ

@ সিজেস reorder()আপনি এই ক্ষেত্রে ব্যবহার করে কীভাবে প্রস্তাব করবেন ? পুনঃনির্মাণের জন্য প্রয়োজনীয় ফ্যাক্টরটি নিজেই কিছু ফাংশন দ্বারা পুনরায় সাজানো দরকার এবং আমি এটি করার একটি ভাল উপায় দেখার জন্য লড়াই করছি।
গ্যাভিন সিম্পসন

ঠিক আছে, with(theTable, reorder(Position, as.character(Position), function(x) sum(duplicated(x))))একটি উপায়, এবং অন্যটি with(theTable, reorder(Position, as.character(Position), function(x) as.numeric(table(x))))তবে এগুলি ঠিক তেমনি সংশ্লেষিত ...
গ্যাভিন সিম্পসন

আমি উত্তরটি কিছুটা সহজ করার sortপরিবর্তে কিছুটা সহজ করেছিলামorder
প্রসাদ চালসানী

@ গ্যাভিন - সম্ভবত আমি প্রসাদের মূল কোডটি ভুল বুঝেছি (পরীক্ষার জন্য আমার কাছে এই মেশিনে আর নেই ...) তবে দেখে মনে হচ্ছিল তিনি ফ্রিকোয়েন্সি ভিত্তিতে বিভাগগুলি পুনরায় সাজিয়ে reorderযাচ্ছেন যা করতে পারদর্শী। আমি এই প্রশ্নের জন্য সম্মত যে আরও কিছু জড়িত প্রয়োজন। বিভ্রান্তির জন্য দুঃখিত.
তাড়াতাড়ি

17

@ হলগারব্রেন্ডল দ্বারা উল্লিখিত forcats :: fct_infreq ছাড়াও এখানে রয়েছে forcats :: fct_rev, যা ফ্যাক্টর ক্রমটিকে বিপরীত করে।

theTable <- data.frame(
    Position= 
        c("Zoalkeeper", "Zoalkeeper", "Defense",
          "Defense", "Defense", "Striker"),
    Name=c("James", "Frank","Jean",
           "Steve","John", "Tim"))

p1 <- ggplot(theTable, aes(x = Position)) + geom_bar()
p2 <- ggplot(theTable, aes(x = fct_infreq(Position))) + geom_bar()
p3 <- ggplot(theTable, aes(x = fct_rev(fct_infreq(Position)))) + geom_bar()

gridExtra::grid.arrange(p1, p2, p3, nrow=3)             

gplot আউটপুট


"fct_infreq (অবস্থান)" হ'ল ছোট কাজ যা এত কিছু করে, ধন্যবাদ !!
পল

12

আমি জাকের সাথে একমত যে dplyr এর মধ্যে গণনাই সেরা সমাধান। আমি এটি সবচেয়ে সংক্ষিপ্ত সংস্করণ হিসাবে পেয়েছি:

dplyr::count(theTable, Position) %>%
          arrange(-n) %>%
          mutate(Position = factor(Position, Position)) %>%
          ggplot(aes(x=Position, y=n)) + geom_bar(stat="identity")

এটি পূর্বে ফ্যাক্টরের মাত্রাগুলি পুনরায় সাজানোর চেয়ে উল্লেখযোগ্যভাবে দ্রুত হবে কারণ গণনাটি gpplot বা ব্যবহার না করে dplyr এ সম্পন্ন হয় table


12

চার্ট কলামগুলি যদি নীচের ডেটাফ্রেমের মতো একটি সংখ্যাগত পরিবর্তনশীল থেকে আসে তবে আপনি একটি সহজ সমাধান ব্যবহার করতে পারেন:

ggplot(df, aes(x = reorder(Colors, -Qty, sum), y = Qty)) 
+ geom_bar(stat = "identity")  

বাছাইকরণ ভেরিয়েবলের আগে বিয়োগ চিহ্ন (-কিউটি) সাজানোর দিকটি নিয়ন্ত্রণ করে (আরোহণ / উতরাই)

পরীক্ষার জন্য এখানে কিছু তথ্য রয়েছে:

df <- data.frame(Colors = c("Green","Yellow","Blue","Red","Yellow","Blue"),  
                 Qty = c(7,4,5,1,3,6)
                )

**Sample data:**
  Colors Qty
1  Green   7
2 Yellow   4
3   Blue   5
4    Red   1
5 Yellow   3
6   Blue   6

আমি যখন এই থ্রেডটি পেলাম, তখন আমি উত্তরটি খুঁজছিলাম। আশা করি এটি অন্যের জন্য দরকারী।


8

ব্যবহার করে আরেকটি বিকল্প একটি ফ্যাক্টরের মাত্রা অর্ডার করতে পুনরায় ক্রম । গণনার উপর ভিত্তি করে আরোহী (এন) বা অবতরণ ক্রমে (-n) প্যাকেজ fct_reorderথেকে ব্যবহার করা একটির মতোই forcats:

অবতরণ ক্রম

df %>%
  count(Position) %>%
  ggplot(aes(x = reorder(Position, -n), y = n)) +
  geom_bar(stat = 'identity') +
  xlab("Position")

এখানে চিত্র বর্ণনা লিখুন

উর্দ্ধক্রমানুসারে

df %>%
  count(Position) %>%
  ggplot(aes(x = reorder(Position, n), y = n)) +
  geom_bar(stat = 'identity') +
  xlab("Position")

এখানে চিত্র বর্ণনা লিখুন

ডেটা ফ্রেম:

df <- structure(list(Position = structure(c(3L, 3L, 1L, 1L, 1L, 2L), .Label = c("Defense", 
"Striker", "Zoalkeeper"), class = "factor"), Name = structure(c(2L, 
1L, 3L, 5L, 4L, 6L), .Label = c("Frank", "James", "Jean", "John", 
"Steve", "Tim"), class = "factor")), class = "data.frame", row.names = c(NA, 
-6L))

5

যেহেতু আমরা কেবল দুটি ভেরিয়েবলের মধ্যে সম্পর্কের দিকে তাকানোর বিপরীতে কেবলমাত্র একটি একক ভেরিয়েবলের বিতরণ ("পজিশন") দেখছি , তাহলে সম্ভবত একটি হিস্টোগ্রামই হবে আরও উপযুক্ত গ্রাফ। ggplot এর geom_histogram () এটি সহজ করে তোলে:

ggplot(theTable, aes(x = Position)) + geom_histogram(stat="count")

এখানে চিত্র বর্ণনা লিখুন

জিওম_হিসটোগ্রাম () ব্যবহার করে:

আমি মনে করি জিওম_হিসটোগ্রাম ( ) এটি অবিচ্ছিন্ন এবং ক্রমাগত এবং পৃথক পৃথক উপাত্তকে আলাদাভাবে আচরণ করে।

জন্য ক্রমাগত তথ্য , আপনি শুধু ব্যবহার করতে পারেন geom_histogram () কোন প্যারামিটার দিয়ে। উদাহরণস্বরূপ, আমরা যদি একটি সংখ্যক ভেক্টর "স্কোর" যুক্ত করি ...

    Name   Position   Score  
1   James  Goalkeeper 10
2   Frank  Goalkeeper 20
3   Jean   Defense    10
4   Steve  Defense    10
5   John   Defense    20
6   Tim    Striker    50

এবং "স্কোর" ভেরিয়েবলে জিওম_হিসটোগ্রাম () ব্যবহার করুন ...

ggplot(theTable, aes(x = Score)) + geom_histogram()

এখানে চিত্র বর্ণনা লিখুন

জন্য বিযুক্ত তথ্য "অবস্থান" মত আমরা ব্যবহার বার উচ্চতার জন্য Y মান দিতে নান্দনিক দ্বারা নির্ণিত একটি হিসাব পরিসংখ্যাত নির্দিষ্ট করতে হবে stat = "count":

 ggplot(theTable, aes(x = Position)) + geom_histogram(stat = "count")

দ্রষ্টব্য: কৌতূহলীভাবে এবং বিভ্রান্তিকরভাবে আপনি stat = "count"পাশাপাশি ধারাবাহিক ডেটাও ব্যবহার করতে পারেন এবং আমি মনে করি এটি আরও একটি নান্দনিকভাবে আনন্দদায়ক গ্রাফ সরবরাহ করে।

ggplot(theTable, aes(x = Score)) + geom_histogram(stat = "count")

এখানে চিত্র বর্ণনা লিখুন

সম্পাদনাগুলি : দেবানজানবির সহায়ক পরামর্শগুলির জবাবে বর্ধিত উত্তর ।


0

আমি এটি খুব বিরক্তিকর পেয়েছি যা এর ggplot2জন্য 'স্বয়ংক্রিয়' সমাধান দেয় না। এজন্য আমি bar_chart()ফাংশনটি ভিতরে তৈরি করেছি ggcharts

ggcharts::bar_chart(theTable, Position)

এখানে চিত্র বর্ণনা লিখুন

ডিফল্টরূপে bar_chart()বারগুলি বাছাই করে এবং একটি অনুভূমিক প্লট প্রদর্শন করে। সেট সেট পরিবর্তন করতে horizontal = FALSE। উপরন্তু, bar_chart()বার এবং অক্ষ মধ্যে কুদর্শন 'ফাঁক' সরিয়ে ফেলা হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.