Ggplot এ কলামের নাম নির্দিষ্ট করতে কীভাবে একটি ভেরিয়েবল ব্যবহার করবেন


105

আমার একটি জিপিপ্লট কমান্ড রয়েছে

ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )

একটি ফাংশন ভিতরে। তবে আমি রঙ এবং গোষ্ঠী হিসাবে কলামটি বেছে নিতে ফাংশনের একটি প্যারামিটার ব্যবহার করতে সক্ষম হতে চাই। অর্থাৎ আমি এই জাতীয় কিছু চাই

f <- function( column ) {
    ...
    ggplot( rates.by.groups, aes(x=name, y=rate, colour= ??? , group=??? ) )
}

যাতে ggplot এ ব্যবহৃত কলামটি প্যারামিটার দ্বারা নির্ধারিত হয়। যেমন চ ("মাজার") এর জন্য আমরা এর প্রভাব পাই

ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )

তবে চ ("লিঙ্গ") এর জন্য আমরা এর প্রভাব পাই

  ggplot( rates.by.groups, aes(x=name, y=rate, colour=gender, group=gender) )

কিছু জিনিস আমি চেষ্টা করেছি:

ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ) )

এটা কাজ করছে না. নতুবা করেনি

e <- environment() 
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ), environment=e )

উত্তর:


160

আপনি ব্যবহার করতে পারেন aes_string:

f <- function( column ) {
    ...
    ggplot( rates.by.groups, aes_string(x="name", y="rate", colour= column,
                                        group=column ) )
}

যতদিন আপনি একটি স্ট্রিং (যেমন ফাংশন কলাম পাস f("majr")বদলে f(majr))। এছাড়াও নোট করুন যে আমরা অন্যান্য কলামগুলি "name"এবং "rate"স্ট্রিংগুলিতে পরিবর্তন করেছি।

যদি আপনি যে কারণে ব্যবহার না করতে চান তবে aes_stringআপনি এটিকে কিছুটা জটিল করে তুলতে পারেন:

    ggplot( rates.by.groups, aes(x=name, y=rate, colour= get(column),
                                        group=get(column) ) )

এটি বলার অপেক্ষা রাখে না যে আপনার করা / করা উচিত নয় aes_string(x = rates.by.groups$name...এবং যাইহোক আপনি ইতিমধ্যে তর্কটি পাস করার পরে আপনার প্রয়োজন হবে না ggplot(data = rates.by.groups...। (বিষয়টি এই প্রশ্নের )
smci

3
Ggplot2 সংস্করণ 3.0.0 এর আপডেটের সাথে মুডি_ মুডসকিপারের উত্তরে লোকদের নির্দেশ করার জন্য কেবল একটি নোট যুক্ত করুন
গ্রেগর থমাস

@ বুন্সিস এটি সত্য নয়, উদ্ধৃতি দেওয়া "column_name"বা "column"কাজ করবে না
ডেভিড রবিনসন

@ ডেভিডরবিনসন আমার ভুলের জন্য দুঃখিত, আমি প্যারামিটার সহ
কোনও ফাংশনটিতে কোডটি জড়িত দেখছি না

"কষ্টকর"? আর-এর মানহীন মূল্যায়ন হ'ল উদ্বেগজনকভাবে সবচেয়ে জটিল "বৈশিষ্ট্য" যা আমি কোনও প্রোগ্রামিং ভাষায় এসেছি। সত্যিই পাগল।
জেসেক্সটাইটে

43

এর প্রকাশ নোটগুলি থেকে ggplot2 V3.0.0:

aes () এখন quasiquotation সমর্থন করে যাতে আপনি ব্যবহার করতে পারেন !!, !!!, এবং: =। এটি aes_ () এবং aes_string () প্রতিস্থাপন করে যা এখন নরম-অবমূল্যায়িত (তবে দীর্ঘ সময় ধরে থাকবে)।

মুশকিল উপায়টি এখন ভেরিয়েবলের সাথে থাকা স্ট্রিংকে একটি প্রতীক হিসাবে রূপান্তর করা হবে sym()(যা বেস বেস as.name()/ অন্যান্য হিসাবে প্রায় একই as.symbol()) / ব্যবহার করে এবং এটি ব্যবহার করে উদ্ধৃত করা হবে না!!

ওপির ডেটা সিমুলেট করা আমরা করতে পারি:

library(tidyverse)
rates.by.groups <- data.frame(
  name = LETTERS[1:3],
  rate = 1:3,
  mjr = LETTERS[c(4,4,5)],
  gender = c("M","F","F")
)

f <- function(column) {
  column <- sym(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()
}

f("gender")
f("mjr")
x <- "gender"
f(x)

আমরা যদি ফাংশনটির পরিবর্তে কাঁচা নামগুলি খাওয়াতে পারি তবে আমরা করতে পারি:

f2 <- function(column) {
  column <- ensym(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()
}

এটি ওরফে প্রতীকগুলির সাথে এবং স্ট্রিং লিটারেলের সাথে কাজ করবে

f2(gender)
f2(mjr)
f2("gender")
f2("mjr")

লিওনেল যেমন বলেছেন ensym():

এটি আর্গুমেন্টের বাক্য গঠনকে অনুকরণ করার উদ্দেশ্যে যেখানে আপনি উভয়ই এলএইচএসে সরবরাহ করতে পারেন, উদাহরণস্বরূপ তালিকা (খালি = 1, "উদ্ধৃত" = 2)


একটি নোট অন enquo()

enquo()আর্গুমেন্টকে খাওয়ানো অভিব্যক্তি (অগত্যা প্রতীক নয়) উদ্ধৃত করে, এটি স্ট্রিংকে আক্ষরিক প্রতীক হিসাবে রূপান্তরিত করে না ensym()যাতে এটি এখানে কম রূপান্তরিত হতে পারে তবে আমরা এটি করতে পারি:

f3 <- function(column) {
  column <- enquo(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()
}

f3(gender)
f2(mjr)

12
এই পরিপাটি জিনিসগুলি তাই বিরক্তিকর। aes()নিজের জন্য ডকুমেন্টেশন সম্পর্কে কথা enquo()বললেও এটি কার্যকর হয় না। আর এর ensym()আগে কে শুনেছে ? বড়
সিগ

@ মুডি_ মুডস্কিপারের জন্য f2, চারটি উদাহরণই কাজ করে এবং তাই ক্যারামের নামটি একটি ভেরিয়েবলের (যেমন aname <- "mjr"; f2(aname)) ক্যাপচার করে । যদি আমি ডেটা ফ্রেমটি ব্যবহার করে কোডটি যুক্ত করতে পারি তবে dplyrএটি ভেরিয়েবলের নামের সাথে স্ট্রিং না করে ভেরিয়েবলের নামটি ব্যবহার করে একটি কলাম অনুসন্ধান করার চেষ্টা করে। অন্য কথায়, আমি কীভাবে rates.by.groups %>% group_by(!!column)...কাজ করব এবং এখনও কল করার তিনটি উপায় সমর্থন করব f2?
স্টিভ

1
"ক্যারামের নামটি একটি ভেরিয়েবলে ক্যাপচার করে তোলে": এটি ব্যর্থ হয় না তবে এটি একই ফল দেয় না, ensymনাম হিসাবে প্রদত্ত যুক্তিগুলির সাথে ডিল করার জন্য এবং তাদের চারপাশে উদ্ধৃতি সহ্য করার জন্য ডিজাইন করা হয়েছে। আমি বিশ্বাস করি আপনি যুক্তিটিকে একটি নাম হিসাবে বিবেচনা করতে এবং নামটি পাওয়া না গেলে মানটির পিছনে ফিরে যেতে চাইবেন। এটি আসলে যা ঘটে তা দিয়ে select, তবে তা দিয়ে নয় group_by... এর চারপাশে হ্যাক করা সম্ভব তবে সুস্পষ্ট নয়। যদি এটি আপনার কাছে গুরুত্বপূর্ণ হয় তবে আমি মনে করি এটির নিজস্ব প্রশ্নের প্রাপ্য।
মুডি_ মুডস্কিপার

ধন্যবাদ মুডি_মদস্কিপার ধন্যবাদ। আমি উভয়ই ব্যবহার করছিলাম selectএবং group_byতাই সম্ভবত সমস্যাটি ছিল। আমি একটি নতুন প্রশ্ন তৈরি করতে পারি, তবে আমার একটি সাধারণ উদাহরণ নিয়ে আসতে হবে এবং উত্তর দেওয়া হয়েছে কিনা তা পরীক্ষা করে দেখার দরকার। না পারলে পোস্ট করতে পারি।
স্টিভ

ব্যবহারবিধি !! এর ক্ষেত্রে facet_grid? এটি সাথে কাজ করে facet_grid(cols = vars(!!column))তবে এর সাথে একটি ত্রুটি ছুড়ে দেয়facet_grid(~ !!column)
mRizz

14

এর aes_stringপরিবর্তে ব্যবহার করার চেষ্টা করুন aes


5
এটি দুর্দান্ত পরামর্শ তবে আপনি তাদের বলতে পারেন কেন? aes_string আপনাকে নন-ভেরিয়েবলের জন্য "" ব্যবহার করে তোলে এবং আপনি ভেরিয়েবলগুলি আনকোটেস ব্যবহার করেন। aes_string (x = "foo", y = "ফি", গ্রুপ = পরিবর্তনশীল)
ম্যাটলেশা

@ মতেলেশা সম্ভবত কারণ ভেরিয়েবলটির মান হিসাবে স্ট্রিং রয়েছে
বুঞ্চিস

9

আরেকটি বিকল্প ( ggplot2 > 3.0.0) হ'ল ডেটা ফ্রেম .dataথেকে নির্বাচিত পরিবর্তনশীল / কলামটি স্লাইস করার জন্য পরিচ্ছন্ন মূল্যায়ন সর্বনাম ব্যবহার করা rates.by.groups

library(ggplot2)
theme_set(theme_classic(base_size = 14))

# created by @Moody_Mudskipper
rates.by.groups <- data.frame(
  name = LETTERS[1:3],
  rate = 1:3,
  mjr = LETTERS[c(4, 4, 5)],
  gender = c("M", "F", "F")
)

f1 <- function(df, column) {
  gg <- ggplot(df, 
         aes(x = name, 
             y = rate, 
             fill  = .data[[column]], 
             group = .data[[column]])) +
    geom_col() +
    labs(fill = column)
  return(gg)
}

plot_list <- lapply(list("gender", "mjr"), function(x){ f1(rates.by.groups, x) })
plot_list
#> [[1]]

#> 
#> [[2]]

# combine all plots
library(egg)
ggarrange(plots = plot_list,
          nrow = 2,
          labels = c('A)', 'B)'))

2019-04-04 এ ডিপেক্স প্যাকেজ দ্বারা তৈরি হয়েছিল (v0.2.1.9000)


0

ব্যবহার করা aes_stringএই সমস্যার সমাধান করে না, তবে ত্রুটি বারগুলি যুক্ত করার সময় কোনও সমস্যার মুখোমুখি হয় geom_errorbar। নীচে একটি সহজ সমাধান।

#Identify your variables using the names of your columns indie your dataset
 xaxis   <- "Independent"   
 yaxis   <- "Dependent"
 sd      <- "error"

#Specify error bar range (in 'a-b' not 'a'-'b')
 range   <- c(yaxis, sd)                                #using c(X, y) allows use of quotation marks inside formula
 yerrbar <- aes_string(ymin=paste(range, collapse='-'), 
                       ymax=paste(range, collapse='+'))


#Build the plot
  ggplot(data=Dataset, aes_string(x=xaxis, y=yaxis)) +
    geom_errorbar(mapping=yerrbar, width=15, colour="#73777a", size = 0.5) +
    geom_point   (shape=21)

বোনাস, আপনি জিপিপ্লাটের অভ্যন্তরে এই লাইনগুলি ব্যবহার করে আপনার চক্রান্তের সাথে যুক্ত করতে পারেন:

facet_grid(formula(paste(Variable1, "~", Variable2)))

এই স্ক্রিপ্টটি এই আসল পোস্ট থেকে পরিবর্তিত হয়েছিল: ggplot2 - একটি কাস্টম ফাংশন ব্যবহার করে ত্রুটি বারগুলি


0

এখানে একটি অত্যন্ত সহজ উদাহরণ।

শুধু দুটি জিনিস

  1. স্ট্রিংটিকে একটি প্রতীক হিসাবে পরিবর্তন করুন
  2. যোগ !!যখন আপনি এটি ব্যবহার
select_col <- sym("Petal.Length")

iris %>% 
  ggplot(aes(x = Sepal.Length, y = !!select_col)) +
  geom_point()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.