अस्वीकरण: आर के लिए नया।

नमस्कार! मैं ggtern पैकेज का उपयोग करके जल रसायन के नमूनों के टर्नरी आरेखों को प्लॉट करने का प्रयास कर रहा हूं। निम्नलिखित कोड को चलाने का प्रयास करने से मुझे शीर्षक त्रुटि मिलती है।

require(ggtern)

datos = read.csv("Li, B, Cl.csv", header = T, sep = ";", stringsAsFactors = FALSE)
names(datos) <- c("Muestra", "Li", "B", "Cl")

x11()
plot <- ggtern(data = datos, mapping = aes(x = as.numeric(datos[["Li"]]), y = as.numeric(datos[["Cl"]]), z = as.numeric(datos[["B"]]))) + geom_point()
plot

मेरी समझ से, परमाणु वेक्टर की अपेक्षा करने वाले कुछ निम्न स्तर के कार्य हैं, लेकिन मैं एक इनपुट के रूप में ggtern दे रहा हूं, एक data.frame (str() के माध्यम से जांचा गया)।

एक बार निष्पादित होने के बाद, स्क्रिप्ट कुछ भी नहीं खींचती है। मेरा डेटा निम्नानुसार स्वरूपित है, लेकिन अर्धविराम से अलग:

Muestra Li B Cl XYA3030 2.321334755 3.017842551 94.66082269 XEP3609 9.436334248 45.43581846 45.12784729 XEP3606_1 10.12604478 62.68726944 27.18668578 XEP3606_2 5.18367492 34.94305194 59.87327314 XEP3611 5.859786577 18.8098607 75.33035272 XEP3613 13.60173875 49.1191375 37.27912375 XEP3612 13.11960754 27.07316925 59.80722321 XEP3608 6.473636887 15.58523589 77.94112722 XEP3543 16.93515603 46.59573787 36.4691061

यह "dput(datos)" आउटपुट है, जैसा कि टिप्पणियों में सुझाया गया है।

> dput(datos)

structure(list(Muestra = c("XYA3030", "XEP3609", "XEP3606_1", 
"XEP3606_2", "XEP3611", "XEP3613", "XEP3612", "XEP3608", "XEP3543"
), Li = c(2.321334755, 9.436334248, 10.12604478, 5.18367492, 
5.859786577, 13.60173875, 13.11960754, 6.473636887, 16.93515603
), B = c(3.017842551, 45.43581846, 62.68726944, 34.94305194, 
18.8098607, 49.1191375, 27.07316925, 15.58523589, 46.59573787
), Cl = c(94.66082269, 45.12784729, 27.18668578, 59.87327314, 
75.33035272, 37.27912375, 59.80722321, 77.94112722, 36.4691061
)), class = "data.frame", row.names = c(NA, -9L))

अपडेट: सबसे सरल कोड की कोशिश की जिसके साथ मैं आ सकता था और अभी भी कोई भाग्य नहीं है। क्या मुझे कुछ बुनियादी याद आ रही है?

library(ggtern)
datos = read.csv("Li_B_Cl.csv", header = T, sep = ";", stringsAsFactors = FALSE)
ggtern(data = datos, mapping = aes(x = Li, y = Cl, z = B)) + geom_point()

अपडेट 2: RStudio सत्र और पैकेज को साफ़ किया, ggtern और ggplot2 को फिर से स्थापित किया, फिर सरल कोड चलाया। कोई भाग्य नहीं। यहाँ त्रुटि के बाद ट्रेसबैक है:

> datos = read.csv("Li_B_Cl.csv", header = TRUE, sep = ";", stringsAsFactors = FALSE)
> ggtern(data = datos, mapping = aes(x = Li, y = Cl, z = B)) + geom_point()
Error: $ operator is invalid for atomic vectors
> traceback()
17: transform_position(data, panel_params$x$rescale, panel_params$y$rescale)
16: f(...)
15: self$super()$super()$transform(data, scale_details)
14: f(..., self = self)
13: self$transform(ex, scale_details)
12: .get.tern.extremes(self, list(x.range = self$limits$x, y.range = self$limits$y))
11: f(..., self = self)
10: self$coord$setup_panel_params(scale_x, scale_y, params = self$coord_params)
9: (function (scale_x, scale_y) 
   {
       self$coord$setup_panel_params(scale_x, scale_y, params = self$coord_params)
   })(dots[[1L]][[1L]], dots[[2L]][[1L]])
8: mapply(FUN = f, ..., SIMPLIFY = FALSE)
7: Map(setup_panel_params, scales_x, scales_y)
6: f(..., self = self)
5: layout$setup_panel_params()
4: ggplot_build.ggplot(x)
3: ggplot_build(x)
2: print.ggplot(x)
1: (function (x, ...) 
   UseMethod("print"))(x)
2
Felipe Durán 10 मार्च 2020, 01:41
हाय फेलिप। कृपया अपनी पोस्ट को प्रतिनिधि और न्यूनतम नमूना डेटा शामिल करके प्रतिलिपि प्रस्तुत करने योग्य बनाएं, उदा। dput(datos) का उपयोग करना और फिर आउटपुट को यहां कॉपी और पेस्ट करना।
 – 
Maurits Evers
10 मार्च 2020, 01:47
अपने डेटा को aes में सब्मिट न करें जैसे आप करते हैं - बस कॉलम के नामों का उपयोग करें।/ वेरिएबल
 – 
tjebo
10 मार्च 2020, 01:57
@MauritsEvers, धन्यवाद, बस संपादित किया और मेरे डेटा को चयन योग्य टेक्स्ट और dput आउटपुट के रूप में शामिल किया।
 – 
Felipe Durán
10 मार्च 2020, 02:03
(...)aes(x = "Li", y = "Cl"), z = "B")(...) ने समस्या का समाधान नहीं किया।
 – 
Felipe Durán
10 मार्च 2020, 02:04
aes(x=Li, y=CI)?
 – 
r2evans
10 मार्च 2020, 02:04

2 जवाब

aes में नाम में बदलने से यह मेरे लिए ठीक हो जाता है:

library(ggtern)
ggtern(data = datos, mapping = aes(x = Li, y = Cl, z = B)) + geom_point()

ggtern

सामान्य तौर पर, aes नामों (या प्रतीकों) का उपयोग करता है, जिसका अर्थ है अउद्धृत। ऐसे समय होते हैं जब यह वांछनीय नहीं होता है, जैसे कि जब या तो आप समय से पहले नाम नहीं जानते हैं या किसी अन्य कारण से इसे प्रोग्रामेटिक रूप से करना चाहते हैं। ऐसे मामलों में जहां आपके पास चर नामों के तार हैं, कोई भी ऐसा कर सकता है:

ggtern(data = datos, mapping = aes_string(x = "Li", y = "Cl", z = "B")) + geom_point()

(या var1 <- "Li", फिर aes_string(x=var1, ...))।

अन्य rlang-कोस का उपयोग करके काम करने के तरीके हैं और ऐसे, जरूरी नहीं कि आपके प्रश्न के लिए प्रासंगिक हों।

विचार करने की एक और बात यह है कि आम तौर पर आप वेरिएबल्स को संदर्भित करते हैं, न कि वैक्टर। आपके कोड में, आपके पास x = as.numeric(datos[["Li"]]) था जो मूल्यों के वेक्टर को पारित करने का प्रयास कर रहा है। ऐसा लगता है कि यह समझ में आता है, हालांकि यह काम नहीं करेगा। डेटा को प्रबंधित करने के लिए ggplot2 (और ggtern, इनहेरिटेंस द्वारा) को अनुमति देने का एक कारण यह है कि कुछ ऐसे ट्रिक्स किए जाएं जिनके लिए अन्यथा थोड़ी अधिक बाहरी/मैनुअल ट्रैकिंग की आवश्यकता होगी। उदाहरण के लिए, आप डेटा के केवल एक सबसेट पर एक परत कार्य कर सकते हैं:

ggtern(data = datos, mapping = aes(x = Li, y = Cl, z = B)) + geom_point() +
  geom_point(color = "red", data = ~ subset(., grepl("XYA", Muestra)))
# the "." means "data as it exists so far" ^^^

(जो एक बिंदु को "लाल" रंग देता है, उसे स्वयं सबसेट करने से निपटने के बिना)। यह विशेष रूप से तब उपयोगी होता है जब आप जिस डेटा को ggplot(data=...) या ggplot(data=...) को पास करते हैं, वह पहले से फ़िल्टर किया जाता है और/या एक पाइप के अंत में होता है, जहां आपको अन्यथा परतों में डेटा को फिर से बनाना होगा। तो ... नामों/प्रतीकों का उपयोग करें, वैक्टर का उपयोग करने का प्रयास न करें।

2
r2evans 10 मार्च 2020, 02:31
धन्यवाद, @ r2evans। लेकिन फिर भी किस्मत नहीं। मेरे कोड के सबसे सरलीकृत रूप में आ गया और उसी त्रुटि से आगे नहीं बढ़ सका। मुझे लगता है कि इसे RStudio, RTools या स्वयं पैकेज की स्थापना के साथ कुछ करना है।
 – 
Felipe Durán
10 मार्च 2020, 06:37
यह देखते हुए कि यह कोड आपके द्वारा प्रदान किए गए डेटा नमूने के साथ काम करता है, यह दर्शाता है कि डेटा नमूना आपके वास्तविक डेटा का प्रतिनिधि नहीं है। मैंने कुछ बेतरतीब ढंग से लगाए गए NA की कोशिश की है और त्रुटि को पुन: उत्पन्न नहीं कर सका। यहाँ मेरा सुझाव है: R को बंद करें और पुनः प्रारंभ करें, ताज़ा (.Rdata का कोई उपयोग नहीं)। ggtern को फिर से इंस्टॉल करें। जैसा आपने ऊपर दिखाया है, वैसे ही अपना डेटा पुनः लोड करें। पुनः प्रयास करें। यदि आपको त्रुटि मिलती है, तो तुरंत traceback() चलाएं और अपने प्रश्न में आउटपुट पोस्ट करें।
 – 
r2evans
10 मार्च 2020, 16:45
आईआईआरसी aes_string पदावनत है, दुख की बात है (यह प्रोग्रामिंग आईएमओ के लिए एकमात्र समझदार इंटरफ़ेस है)।
 – 
alan ocallaghan
10 मार्च 2020, 23:58
ट्रेसबैक आउटपुट के साथ बस प्रश्न को अपडेट किया। डेटा नमूना वास्तविक डेटा है। अपना समय देने के लिए धन्यवाद!
 – 
Felipe Durán
10 मार्च 2020, 23:58
वह ggplot2:::transform_position में टूट रहा है, ggtern में नहीं। ggplot2 को पुनः स्थापित करने का प्रयास करें।
 – 
r2evans
11 मार्च 2020, 00:09

मैन्युअल रूप से install.packages(url, repos=NULL, type="source") और सरप्राइज का उपयोग करके @r2evans (ggplot2-3.2.1, ggtern-3.1.0) द्वारा इंगित संकुल संस्करण को फिर से स्थापित किया! वो कर गया काम। मैं आर 3.6.3 चला रहा हूं, अगर यह प्रासंगिक है।

1
Felipe Durán 12 मार्च 2020, 23:10
Ggplot3.3.0 में परिवर्तन टूटे हुए ggtern को दिखाई देते हैं। bitbucket.org/nicholasehamilton/ggtern/ मुद्दे/10/…
 – 
kmm
18 मार्च 2020, 19:50
मेरा भी यही विचार है। devtools::install_version("ggplot2", version = "3.2.1") और यह काम कर गया।
 – 
baruuum
6 अप्रैल 2020, 09:24