अस्वीकरण: आर के लिए नया।
नमस्कार! मैं 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 जवाब
aes
में नाम में बदलने से यह मेरे लिए ठीक हो जाता है:
library(ggtern)
ggtern(data = datos, mapping = aes(x = Li, y = Cl, z = B)) + geom_point()
सामान्य तौर पर, 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=...)
को पास करते हैं, वह पहले से फ़िल्टर किया जाता है और/या एक पाइप के अंत में होता है, जहां आपको अन्यथा परतों में डेटा को फिर से बनाना होगा। तो ... नामों/प्रतीकों का उपयोग करें, वैक्टर का उपयोग करने का प्रयास न करें।
NA
की कोशिश की है और त्रुटि को पुन: उत्पन्न नहीं कर सका। यहाँ मेरा सुझाव है: R को बंद करें और पुनः प्रारंभ करें, ताज़ा (.Rdata
का कोई उपयोग नहीं)। ggtern
को फिर से इंस्टॉल करें। जैसा आपने ऊपर दिखाया है, वैसे ही अपना डेटा पुनः लोड करें। पुनः प्रयास करें। यदि आपको त्रुटि मिलती है, तो तुरंत traceback()
चलाएं और अपने प्रश्न में आउटपुट पोस्ट करें।
aes_string
पदावनत है, दुख की बात है (यह प्रोग्रामिंग आईएमओ के लिए एकमात्र समझदार इंटरफ़ेस है)।
ggplot2:::transform_position
में टूट रहा है, ggtern
में नहीं। ggplot2
को पुनः स्थापित करने का प्रयास करें।
मैन्युअल रूप से install.packages(url, repos=NULL, type="source")
और सरप्राइज का उपयोग करके @r2evans (ggplot2-3.2.1, ggtern-3.1.0) द्वारा इंगित संकुल संस्करण को फिर से स्थापित किया! वो कर गया काम। मैं आर 3.6.3 चला रहा हूं, अगर यह प्रासंगिक है।
devtools::install_version("ggplot2", version = "3.2.1")
और यह काम कर गया।
dput(datos)
का उपयोग करना और फिर आउटपुट को यहां कॉपी और पेस्ट करना।aes
में सब्मिट न करें जैसे आप करते हैं - बस कॉलम के नामों का उपयोग करें।/ वेरिएबलaes(x=Li, y=CI)
?