changeset 0:653803fab921 draft default tip

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/ggplot2 commit 57b86418a4f032a5664b8dc1c9585a11be629158
author iuc
date Thu, 15 May 2025 13:02:31 +0000
parents
children
files ggplot2_boxplot.xml macros.xml test-data/barplot_test_data.txt test-data/boxplot_test_data.txt test-data/boxplot_test_expDesign.txt test-data/ggplot_heatmap_result1.pdf test-data/ggplot_histogram_result1.pdf test-data/ggplot_line_result1.pdf test-data/ggplot_pca_result1.pdf test-data/ggplot_point_result1.pdf test-data/ggplot_point_result2.pdf test-data/ggplot_point_result3.pdf test-data/ggplot_violin_result1.pdf test-data/mtcars.txt utils.r
diffstat 15 files changed, 683 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ggplot2_boxplot.xml	Thu May 15 13:02:31 2025 +0000
@@ -0,0 +1,244 @@
+<tool id="ggplot2_boxplot" name="Boxplot w ggplot2" version="@TOOL_VERSION@+galaxy0" profile="23.0">
+    <description>Boxplot visualization tool using ggplot2</description>
+    <macros>
+        <import>macros.xml</import>
+    </macros>
+    <expand macro="requirements">
+        <requirement type="package" version="1.3.1">r-tidyr</requirement>
+        <requirement type="package" version="19.0.0">r-arrow</requirement>
+        <requirement type="package" version="1.1.5">r-rlang</requirement>
+    </expand>
+    <required_files>
+        <include path="utils.r" />
+    </required_files>
+    <creator>
+        <person
+            givenName="Kristina"
+            familyName="Gomoryova"
+            url="https://github.com/KristinaGomoryova"
+            identifier="0000-0003-4407-3917" />
+        <person
+            givenName="Helge"
+            familyName="Hecht"
+            url="https://github.com/hechth"
+            identifier="0000-0001-6744-996X" />
+        <organization
+            url="https://www.recetox.muni.cz/"
+            email="GalaxyToolsDevelopmentandDeployment@space.muni.cz"
+            name="RECETOX MUNI" />
+    </creator>
+    
+    <command detect_errors="exit_code"><![CDATA[
+        Rscript -e 'source("${__tool_directory__}/utils.r")' -e 'source("${run_script}")'
+        #if $export_R_script
+        && cat ${run_script} >> $script
+        #end if
+    ]]></command>
+
+    <configfiles>
+        <configfile name="run_script"><![CDATA[
+        file_name <- "$input_data"
+        file_extension <- "$input_data.ext"
+        data_input <- load_data(file_name, file_extension)
+
+        #if $has_rownames
+        rownames(data_input) <- data_input[, 1]
+        data_input <- data_input[ ,-1]
+        #end if
+
+        y_colname <- "intensity"
+        data_long <- tidyr::pivot_longer(data_input,
+                                         cols = c(1:ncol(data_input)),
+                                         names_to = "samples",
+                                         values_to = y_colname)
+
+        #if $transform_data == "replace_zero"
+        data_long[data_long == 0] <- NA
+        #else if $transform_data == "log2"
+        data_long[[y_colname]] <- log2(data_long[[y_colname]])
+        #else if $transform_data == "log10"
+        data_long[[y_colname]] <- log10(data_long[[y_colname]])        
+        #end if
+
+        #if $grouping_boxplot.use_grouping == "yes"
+        metadata_input <- read.delim("$grouping_boxplot.input_metadata", sep="\t",  check.names = "false")
+        sampleID_column <- colnames(metadata_input)[$grouping_boxplot.sampleID]
+        plotting_column <- colnames(metadata_input)[$grouping_boxplot.groupingCol]
+        metadata_input <- data.frame(lapply(metadata_input, as.factor))
+
+        data_long <- dplyr::left_join(data_long, metadata_input, by = c("samples" = sampleID_column), keep = TRUE)
+
+        #if $grouping_boxplot.facet_x
+        facet_x <- rlang::sym(colnames(metadata_input)[$grouping_boxplot.facet_x])
+        #else 
+        facet_x <- NULL
+        #end if
+ 
+        #if $grouping_boxplot.facet_y
+        facet_y <- rlang::sym(colnames(metadata_input)[$grouping_boxplot.facet_y])
+        #else
+        facet_y <- NULL
+        #end if
+
+        plot_boxplot <- ggplot2::ggplot(
+            data_long, ggplot2::aes(
+                x = !!rlang::sym(plotting_column),
+                y = intensity,
+                #if $grouping_boxplot.colorCol
+                fill = !!rlang::sym(colnames(metadata_input)[$grouping_boxplot.colorCol])
+                #end if
+            )) + ggplot2::geom_boxplot() +
+                 ggplot2::theme_bw()+
+                 ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 45, hjust=1)) +
+                 ggplot2::facet_grid(rows = if(!is.null(facet_y)) dplyr::vars(!!facet_y) else NULL,
+                                     cols = if(!is.null(facet_x)) dplyr::vars(!!facet_x) else NULL,
+                                     scales = "free")
+
+
+        #else 
+
+        plot_boxplot <- ggplot2::ggplot(
+            data_long,
+            ggplot2::aes(x = samples, y = intensity)
+        ) + ggplot2::geom_boxplot() +
+            ggplot2::theme_bw()+
+            ggplot2::theme(axis.text.x = ggplot2::element_text(angle = 45, hjust=1))
+
+        #end if
+
+        #if $xlab
+        plot_boxplot <- plot_boxplot + ggplot2::xlab("$xlab")
+        #end if
+
+        #if $ylab
+        plot_boxplot <- plot_boxplot + ggplot2::ylab("$ylab")
+        #end if
+
+        #if $flip_axes == "true"
+        plot_boxplot <- plot_boxplot + ggplot2::coord_flip()
+        #end if
+
+        ggplot2::ggsave(filename = "boxplot.png", plot_boxplot)
+        ]]></configfile>
+    </configfiles>
+
+    <inputs>
+        <expand macro="data_input"/>
+        <param name="has_rownames" type="boolean" checked="false" truevalue="TRUE" falsevalue="FALSE" label="Does the first column of input table contain rownames?" help="Whether the first column of the input data table identifies the rownames (e.g. proteinID) - i.e. it is not a part of data matrix to be plotted."/>
+        <param name="transform_data" type="select" display="radio" label="Should the quantitative variable be transformed?" optional="false" help="Whether to transform the quantitative variable (e.g. intensity, counts, etc.)">
+            <option value="none" selected="true">No transformation</option>
+            <option value="replace_zero">Replace zeroes with NA values</option>
+            <option value="log2">Log2 transformation</option> 
+            <option value="log10">Log10 transformation</option> 
+        </param>
+        <param name="flip_axes" type="boolean" checked="false" truevalue="TRUE" falsevalue="FALSE" label="Plot the boxplots horizontally? (flip the axes)" help="Whether to flip the axes, so the boxplots will be horizontal instead of vertical."/> 
+        <conditional name="grouping_boxplot">
+            <param type="select" name="use_grouping" label="Plot boxplot based on a column from the metadata table?" help="Whether to base the boxplot on a different variable than column names (usually corresponding to the samples) from the input table.">
+                <option value="no" selected="true">no</option> 
+                <option value="yes">yes</option>
+            </param>     
+            <when value="yes">
+                <param name="input_metadata" type="data" format="tabular" label="Input metadata table" help= "Input metadata file in a tabular format"/>
+                <param name="sampleID" type="data_column" data_ref="input_metadata" use_header_names="true" label="Sample identification column in metadata table" help="Column containing sample names - it should correspond to the colNames in the data table."/>
+                <param name="groupingCol" type="data_column" data_ref="input_metadata" use_header_names="true" label="Which variable column to plot on the x-axis?" help="Which column from the metadata table should be plotted on x axis?"/>
+                <param name="colorCol" type="data_column" data_ref="input_metadata" use_header_names="true" label="Color the boxplot based on a variable?" help="Which column from the metadata table should be used for coloring?" optional = "true"/>
+                <param name="facet_x" type="data_column" data_ref="input_metadata" use_header_names="true" label="Column to use as facet on x-axis" optional="true" help="If using faceting, which column should be plotted on x-axis? Default 'Nothing selected' means no faceting will be done on x-axis."/>
+                <param name="facet_y" type="data_column" data_ref="input_metadata" use_header_names="true" label="Column to use as facet on y-axis" optional="true" help="If using faceting, which column should be plotted on y-axis? Default 'Nothing selected' means no faceting will be done on y-axis."/>
+            </when>
+            <when value="no"/>
+        </conditional>
+        <expand macro="axes_labels"/>
+        <expand macro="export_data"/>
+    </inputs>
+
+    <outputs>
+        <data name="boxplot" format="png" label="Boxplot on ${on_string}" from_work_dir="boxplot.png"/>        
+        <data name="script" format="txt" label="R script">
+            <filter>export_R_script</filter>
+        </data>
+    </outputs>
+
+    <tests>
+        <test expect_num_outputs="1">
+            <param name="input_data" value="boxplot_test_data.txt" ftype="tabular"/>
+            <param name="has_rownames" value="true"/>
+            <output name="boxplot" ftype="png">
+                <assert_contents>
+                    <has_image_channels channels="1"/>
+                    <has_image_height height="2100"/>
+                    <has_image_width width="2100" />
+                    <has_image_center_of_mass center_of_mass="1048.15, 1051.40" eps="0.1"/>
+                </assert_contents>
+            </output>          
+        </test>
+        <test expect_num_outputs="2">
+            <param name="input_data" value="boxplot_test_data.txt" ftype="tabular"/>
+            <param name="has_rownames" value="true"/>
+            <param name="use_grouping" value="yes"/>
+            <param name="input_metadata" value="boxplot_test_expDesign.txt"/>
+            <param name="sampleID" value="1"/>
+            <param name="groupingCol" value="1"/>
+            <param name="export_R_script" value="TRUE"/>
+            <output name="boxplot" ftype="png">
+                <assert_contents>
+                    <has_image_channels channels="1"/>
+                    <has_image_height height="2100"/>
+                    <has_image_width width="2100" />
+                    <has_image_center_of_mass center_of_mass="1048.14, 1051.30" eps="0.1"/>
+                </assert_contents>
+            </output>          
+        </test>
+    </tests>
+
+    <help><![CDATA[
+recetox-boxplot help
+=====================
+
+Overview
+--------
+
+recetox-boxplot tool can be used to plot boxplots for the tabular data. On the input, a dataframe in tabular/csv/parquet format, containing only columns to be plotted (the pre-filtering can be achieved e.g. using the `Cut` Galaxy tool) is expected. If the data contains as the first column the rownames - meaning identificators, ProteinID, etc., please do set the `Does the first column of input table contain rownames?` to TRUE.  
+
+Typically, a table where rows are features and columns are samples is expected - if one wishes to plot the boxplots for the features, we recommend to transpose the table beforehand.
+
+Sometimes, it is better to transform the data for the visualization (or processing) purposes (`Should the quantitative variable be transformed?`). If no transformation option is selected, the data will be plotted as it is. Otherwise, one can choose from replacing all zero values by NA, log2 transformation or log10 transformation. Please note, that NA values are omitted while plotting.
+
+`Plot the boxplots horizontally?` option means flipping the axes: a categorical variable (e.g. samples) would be on y-axis, whereas quantitative variable (e.g. intensity) would be on x-axis. This improves the legibility in case of larger datasets.
+
+It is possible to use also a different variable for the plotting and coloring - in that case, a metadata table (in a tabular format) can be supplied. The metadata table must contain a column which will map to the data table column names (e.g. SampleName). 
+
+It is also possible to use faceting, meaning splitting the plot based on multiple variables. One can then choose which variable to split the x axis and y axis on.
+
+Example data table
+-------------------
+
++----------------------+-------------------+-----------------------+--------------------+
+| RowID                |    sample1        |    sample2            |    sample3         |
++======================+===================+=======================+====================+
+| 1                    |    350.58         |    211.33             |    288.90          |
++----------------------+-------------------+-----------------------+--------------------+
+| 2                    |    130.17         |    287.54             |    100.11          |
++----------------------+-------------------+-----------------------+--------------------+
+| 3                    |    134.80         |    683.15             |    112.34          |
++----------------------+-------------------+-----------------------+--------------------+
+| 4                    |    183.99         |    920.57             |    590.44          |
++----------------------+-------------------+-----------------------+--------------------+
+| ...                  |    ...            |    ...                |    ...             |
++----------------------+-------------------+-----------------------+--------------------+
+
+
+Example metadata table
+-----------------------
+
++----------------------+-------------------+-----------------------+--------------------+
+| SampleName           |    replicate      |    condition          |    batch           |
++======================+===================+=======================+====================+
+| sample1              |    1              |    control            |    A               |
++----------------------+-------------------+-----------------------+--------------------+
+| sample2              |    1              |    treatment          |    A               |
++----------------------+-------------------+-----------------------+--------------------+
+| sample3              |    2              |    treatment          |    A               |
++----------------------+-------------------+-----------------------+--------------------+
+]]></help>
+    <expand macro="citations"/>
+</tool>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml	Thu May 15 13:02:31 2025 +0000
@@ -0,0 +1,358 @@
+<?xml version="1.0"?>
+<macros>
+    <xml name="requirements">
+        <requirements>
+            <requirement type="package" version="@TOOL_VERSION@">r-ggplot2</requirement>
+            <yield />
+        </requirements>
+    </xml>
+    <xml name="bio_tools">
+        <xrefs>
+            <xref type="bio.tools">ggplot2</xref>
+        </xrefs>
+    </xml>
+    <token name="@TOOL_VERSION@">3.5.1</token>
+    <token name="@VERSION_SUFFIX@">1</token>
+
+    <token name="@R_INIT@"><![CDATA[
+        ## Setup R error handling to go to stderr
+        options(show.error.messages=F, error=function(){cat(geterrmessage(), file=stderr()); q("no",1,F)})
+
+        ## Unify locale settings
+        loc <- Sys.setlocale("LC_MESSAGES", "en_US.UTF-8")
+    ]]></token>
+
+    <token name="@TRANSFORM@"><![CDATA[
+        #if $adv.transform == "log2"
+            input["value"] <- log2(input["value"])
+        #elif $adv.transform == "log2plus1"
+            input["value"] <- log2(input["value"]+1)
+        #elif $adv.transform == "log10"
+            input["value"] <- log10(input["value"])
+        #elif $adv.transform == "log10plus1"
+            input["value"] <- log10(input["value"]+1)
+        #end if
+    ]]></token>
+
+    <token name="@XY_SCALING@"><![CDATA[
+        #Choose between automatically scaled x and y axis or user defined
+        #if $adv.scaling.plot_scaling == "Automatic"
+            gg_scalex = NULL
+            gg_scaley = NULL
+        #else
+            gg_scalex = xlim($adv.scaling.xaxismin, $adv.scaling.xaxismax)
+            gg_scaley = ylim($adv.scaling.yaxismin, $adv.scaling.yaxismax)
+            cat("\n xaxismin: ", $adv.scaling.xaxismin)
+            cat("\n xaxismax: ", $adv.scaling.xaxismax)
+            cat("\n yaxismin: ", $adv.scaling.yaxismin)
+            cat("\n yaxismax: ", $adv.scaling.yaxismax)
+        #end if
+    ]]></token>
+
+    <token name="@THEME@"><![CDATA[
+        ## Choose theme for plot
+        #if $adv.theme == "bw"
+            gg_theme = theme_bw()
+        #else
+            gg_theme = NULL
+        #end if
+    ]]></token>
+
+    <token name="@LEGEND@"><![CDATA[
+        ## Show/hide legend
+        #if $adv.legend == "yes"
+            gg_legend = theme(legend.position="right")
+        #else
+            gg_legend = theme(legend.position="none")
+            cat("\n no legend")
+        #end if
+    ]]></token>
+    <token name="@SAVE_OUTPUT@"><![CDATA[
+        ## output options need to be in out section
+        gg_width <- as.double('$out.width_output_dim')
+        gg_height <- as.double('$out.height_output_dim')
+        gg_unit <- '$out.unit_output_dim'
+        gg_dpi <- as.double('$out.dpi_output_dim')
+        gg_add_device <- '$out.additional_output_format'
+        output1 <- '$output1'
+        output2 <- '$output2'
+
+        ## ggsave to png
+        ggsave(filename = output1, plot = plot_out, width = gg_width, height = gg_height, units = gg_unit, dpi = gg_dpi, device = "png")
+        if(gg_add_device != "none"){
+          ggsave(filename = output2, plot = plot_out, width = gg_width, height = gg_height, units = gg_unit, dpi = gg_dpi, device = gg_add_device)
+        }
+    ]]></token>
+    <xml name="read_complex_input">
+        <param name="input1" type="data" format="tabular" label="Select table"/>
+        <conditional name="inputdata">
+            <param name="input_type" type="select" label="Select input dataset options" help="specific dataset input for reading">
+                <option value="with_header" selected="true">Dataset with header</option>
+                <option value="with_rownames">Dataset with row names</option>
+                <option value="with_header_rownames">Dataset with header and row names</option>
+                <option value="no_header_rownames">Dataset without header or row names</option>
+            </param>
+            <when value="with_header">
+                <param name="header" type="hidden" value="TRUE"/>
+                <param name="row_names_index" type="hidden" value="0"/>
+                <param name="sample_name_orientation" type="select" display="radio" multiple="false" label="Sample names orientation" help="Default horizontal: header names are interpreted as sample names">
+                    <option value="TRUE" selected="true">horizontal</option>
+                    <option value="FALSE">vertial</option>
+                </param>
+            </when>
+            <when value="with_rownames">
+                <param name="header" type="hidden" value="FALSE"/>
+                <param name="row_names_index" type="data_column" data_ref="input1" label="Select column, for row names" help="WARNING: please consider that using row names might shift the grouping columns"/>
+                <param name="sample_name_orientation" type="select" display="radio" label="Sample names orientation" help="default vertial: row names are interpreted as sample names">
+                    <option value="TRUE">horizontal</option>
+                    <option value="FALSE" selected="true">vertial</option>
+                </param>
+            </when>
+            <when value="with_header_rownames">
+                <param name="header" type="hidden" value="TRUE"/>
+                <param name="row_names_index" type="data_column" data_ref="input1" label="Select column, for row names" help="WARNING: please consider that using row names might shift the grouping columns"/>
+                <param name="sample_name_orientation" type="select" label="Sample names orientation" display="radio" multiple="false" help="deside whether header names or row names are interpreted as sample names">
+                    <option value="TRUE" selected="true">horizontal</option>
+                    <option value="FALSE">vertial</option>
+                </param>
+            </when>
+            <when value="no_header_rownames">
+                <param name="header" type="hidden" value="FALSE"/>
+                <param name="row_names_index" type="hidden" value="0"/>
+                <param name="sample_name_orientation" type="hidden" value="TRUE"/>
+            </when>
+        </conditional>
+    </xml>
+    <xml name="transform">
+        <param name="transform" type="select" label="Data transformation">
+            <option value="none">Plot the data as it is</option>
+            <option value="log2">Log2(value) transform my data</option>
+            <option value="log2plus1">Log2(value+1) transform my data</option>
+            <option value="log10">Log10(value) transform my data</option>
+            <option value="log10plus1">Log10(value+1) transform my data</option>
+        </param>
+    </xml>
+    <xml name="xy_scaling">
+        <conditional name="scaling">
+            <param name="plot_scaling" type="select" label="Axis scaling">
+                <option value="Automatic" selected="true">Automatic axis scaling</option>
+                <option value="Defined">User-defined axis scales</option>
+            </param>
+            <when value="Automatic"/>
+            <when value="Defined">
+                <param name="xaxismin" type="float" value="0" label="minimal range of x-axis" />
+                <param name="xaxismax" type="float" value="3" label="maximal range of x-axis" />
+                <param name="yaxismin" type="float" value="0" label="minimal range of y-axis" />
+                <param name="yaxismax" type="float" value="3" label="maximal range of y-axis" />
+            </when>
+        </conditional>
+    </xml>
+    <xml name="title">
+       <param name="title" type="text" value="" label="Plot title">
+            <!--<sanitizer sanitize="false"/> -->
+        </param>
+    </xml>
+    <xml name="xy_lab">
+        <param name="xlab" type="text" value="Title of x-axis" label="Label for x axis">
+            <sanitizer sanitize="false"/>
+        </param>
+        <param name="ylab" type="text" value="Title of y-axis" label="Label for y axis">
+            <sanitizer sanitize="false"/>
+        </param>
+    </xml>
+    <xml name="legend">
+        <param name="legend" type="select" label="Legend options">
+            <option value="yes">Include legend on plot</option>
+            <option value="no">Hide legend</option>
+        </param>
+    </xml>
+    <xml name="theme">
+        <param name="theme" type="select" label="Backgound theme for plot">
+            <option value="bw">Black and white</option>
+            <option value="Default">Default (grey)</option>
+        </param>
+    </xml>
+    <xml name="dimensions">
+        <param name="unit_output_dim" type="select" label="Unit of output dimensions" help="Default: inches.">
+            <option value="in" selected="true">Inches (in)</option>
+            <option value="cm">Centimeters (cm)</option>
+            <option value="mm">Millimeters (mm)</option>
+        </param>
+        <param name="width_output_dim" type="float" value="7" label="width of output"/>
+        <param name="height_output_dim" type="float" value="7" label="height of output"/>
+        <param name="dpi_output_dim" type="float" value="300" label="dpi of output" help="Plot resolution. Applies only to raster output types."/>
+        <param name="additional_output_format" type="select" label="Additional output format" help="PNG is always selected as output format.">
+            <option value="none" selected="true">Only PNG</option>
+            <option value="pdf">PDF</option>
+            <option value="svg">SVG</option>
+            <option value="eps">EPS</option>
+            <option value="ps">PS</option>
+            <option value="tex">TEX (pictex)</option>
+            <option value="jpeg">JPEG</option>
+            <option value="tiff">TIFF</option>
+            <option value="bmp">BMP</option>
+        </param>
+    </xml>
+    <xml name="citations">
+        <citations>
+            <citation type="bibtex">@book{wickham2009ggplot2,
+                author = {Hadley Wickham},
+                title = {ggplot2: Elegant Graphics for Data Analysis},
+                publisher = {Springer-Verlag New York},
+                year = {2009},
+                isbn = {978-0-387-98140-6},
+                url = {https://ggplot2.tidyverse.org/},
+                }
+            </citation>
+            <yield />
+        </citations>
+    </xml>
+    <xml name="axis_customization" token_label="Axis title options">
+        <param name="axis_customization" type="select" label="@LABEL@">
+            <option value="default" selected="true">Default</option>
+            <option value="defined">User defined label options</option>
+        </param>
+        <when value="default"/>
+        <when value="defined">
+            <param name="size" type="float" value="12" label="Axis label size (default = 12)"/>
+            <param name="color" type="select" label="Color of axis label">
+                <option value="black">Black (default)</option>
+                <option value="red">Red</option>
+                <option value="white">White</option>
+                <option value="blue">Blue</option>
+                <option value="orange">Orange</option>
+                <option value="yellow">Yellow</option>
+                <option value="green">Green</option>
+                <option value="purple">Purple</option>
+                <option value="magenta">Magenta</option>
+                <option value="cyan">Cyan</option>
+                <option value="grey">Grey</option>
+                <option value="gold">Gold</option>
+            </param>
+            <param name="face" type="select" label="Font effect of axis label">
+                <option value="plain">Normal (default)</option>
+                <option value="bold">Bold</option>
+                <option value="italic">Italic</option>
+            </param>
+        </when>
+    </xml>
+    <xml name="colors">
+        <param name="colors" type="select" label="Color schemes to differentiate your groups" >
+            <option value="Default">Default color scheme</option>
+            <option value="YlOrRd">Yellow to orange to red (discrete, max=9 colors)</option>
+            <option value="YlOrBr">Yellow to orange to brown (discrete, max=9 colors)</option>
+            <option value="YlGnBu">Yellow to green to blue (discrete, max=9 colors)</option>
+            <option value="YlGn">Yellow to green (discrete, max=9 colors)</option>
+            <option value="Reds">Shades of red from light to dark (discrete, max=9 colors)</option>
+            <option value="RdPu">Red to purple (discrete, max=9 colors)</option>
+            <option value="Purples">Shades of purple from light to dark (discrete, max=9 colors)</option>
+            <option value="PuRd">Purple to red (discrete, max=9 colors)</option>
+            <option value="PuBuGn">Purple to blue to green (discrete, max=9 colors)</option>
+            <option value="PuBu">Purple to blue(discrete, max=9 colors)</option>
+            <option value="OrRd">Orange to red (discrete, max=9 colors)</option>
+            <option value="Oranges">Shades of orange from light to dark (discrete, max=9 colors)</option>
+            <option value="Greys">Shades of grey from light to dark (discrete, max=9 colors)</option>
+            <option value="Greens">Shades of greens from light to dark (discrete, max=9 colors)</option>
+            <option value="GnBu">Green to blue (discrete, max=9 colors)</option>
+            <option value="BuPu">Blue to purple (discrete, max=9 colors)</option>
+            <option value="BuGn">Blue to green (discrete, max=9 colors)</option>
+            <option value="Blues">Shades of blue from light to dark (discrete, max=9 colors)</option>
+            <option value="Set1">Set 1 - predefined color pallete (discrete, max=9 colors)</option>
+            <option value="Set2">Set 2 - predefined color pallete (discrete, max=8 colors)</option>
+            <option value="Set3">Set 3 - predefined color pallete (discrete, max=12 colors)</option>
+            <option value="Pastel1">Pastel 1 - predefined pastel color pallete (discrete, max=9 colors)</option>
+            <option value="Pastel2">Pastel 2 - predefined pastel color pallete (discrete, max=8 colors)</option>
+            <option value="Paired">Paired - predefined color pallete (discrete, max=12 colors)</option>
+            <option value="Dark2">Dark 2 - predefined color pallete (discrete, max=12 colors)</option>
+            <option value="Accent">Accent - predefined color pallete (discrete, max=12 colors)</option>
+            <option value="Spectral">Spectral - Red to yellow to purple (discrete, max=11 colors)</option>
+            <option value="RdYlGn">Red to yellow to green (discrete, max=11 colors)</option>
+            <option value="RdYlBu">Red to yellow to blue (discrete, max=11 colors)</option>
+            <option value="RdGy">Red to grey (discrete, max=11 colors)</option>
+            <option value="RdBu">Red to blue (discrete, max=11 colors)</option>
+            <option value="PuOr">Purple to orange (discrete, max=11 colors)</option>
+            <option value="PRGn">Purple to green (discrete, max=11 colors)</option>
+            <option value="BrBG">Brown to teal (discrete, max=11 colors)</option>
+        </param>
+    </xml>
+    <xml name="additional_output">
+        <data name="output1" format="png" label="${tool.name} on ${on_string}: png"/>
+        <data format="pdf" name="output2" label="${tool.name} on ${on_string}: ${out.additional_output_format}">
+            <change_format>
+                <when input="out.additional_output_format" value="svg" format="svg" />
+                <when input="out.additional_output_format" value="eps" format="eps" />
+                <when input="out.additional_output_format" value="ps" format="ps" />
+                <when input="out.additional_output_format" value="tex" format="txt" />
+                <when input="out.additional_output_format" value="jpeg" format="jpg" />
+                <when input="out.additional_output_format" value="tiff" format="tiff" />
+                <when input="out.additional_output_format" value="bmp" format="bmp" />
+            </change_format>
+            <filter>out['additional_output_format'] != "none"</filter>
+        </data>
+    </xml>
+    <xml name="points_options">
+        <conditional name="points">
+            <param name="pointoptions" type="select" label="Data point options">
+                <option value="default" selected="true">Default</option>
+                <option value="defined">User defined point options</option>
+            </param>
+            <when value="default">
+                <!--Do nothing here -->
+            </when>
+            <when value="defined">
+                <param name="size" type="float" value="1" label="relative size of points" />
+                <param name="alpha" type="float" value="1" label="Transparency of points (On a scale of 0-1; 0=transparent, 1=default)" />
+                <param name="pointcolor" type="select" label="Color of data points" >
+                    <option value="black">Black (default)</option>
+                    <option value="red">Red</option>
+                    <option value="white">White</option>
+                    <option value="blue">Blue</option>
+                    <option value="orange">Orange</option>
+                    <option value="yellow">Yellow</option>
+                    <option value="green">Green</option>
+                    <option value="purple">Purple</option>
+                    <option value="magenta">Magenta</option>
+                    <option value="cyan">Cyan</option>
+                    <option value="grey">Grey</option>
+                    <option value="gold">Gold</option>
+                </param>
+                <param name="shape" type="select" label="Shape of data points" >
+                    <option value="0">square</option>
+                    <option value="1">circle</option>
+                    <option value="2">triangle point up</option>
+                    <option value="3">plus</option>
+                    <option value="4">cross</option>
+                    <option value="5">diamond</option>
+                    <option value="6">triangle point down</option>
+                    <option value="7">square cross</option>
+                    <option value="8">star</option>
+                    <option value="9">diamond plus</option>
+                    <option value="10">circle plus</option>
+                    <option value="11">triangles up and down</option>
+                    <option value="12">square plus</option>
+                    <option value="13">circle cross</option>
+                    <option value="14">square and triangle down</option>
+                    <option value="15">filled square</option>
+                    <option value="16">filled circle</option>
+                    <option value="17">filled triangle point-up</option>
+                    <option value="18">filled diamond</option>
+                    <option value="19">solid circle</option>
+                    <option value="20">bullet (smaller circle)</option>
+                </param>
+            </when>
+        </conditional>
+    </xml>
+    <xml name="data_input">
+        <param name="input_data" type="data" format="csv,tsv,txt,tabular,parquet" label="Input table" help= "Input file in a tabular/tsv/csv/parquet format"/>
+    </xml>
+
+    <xml name="axes_labels">
+        <param name="xlab" type="text" label="Label for the x axis" optional="true"/>
+        <param name="ylab" type="text" label="Label for the y axis"  optional="true"/>
+    </xml>
+    
+    <xml name="export_data">
+        <param name="export_R_script" type="boolean" checked="false" truevalue="TRUE" falsevalue="FALSE" label="Export the R script to reproduce the analysis"
+        help="Check this box to export the script executed in the Galaxy tool as an R file to be able to reproduce the same processing offline. Not that in this case, the file paths need to be altered and all the dependencies have to be managed manually."/>
+    </xml>
+</macros>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/barplot_test_data.txt	Thu May 15 13:02:31 2025 +0000
@@ -0,0 +1,10 @@
+Condition	Replicate	Value	ID
+ctrl	1	12	1
+ctrl	2	4	2
+ctrl	3	10	3
+trtA	1	50	4
+trtA	2	52	5
+trtA	3	49	6
+trtB	1	15	7
+trtB	2	10	8
+trtB	3	9	9
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/boxplot_test_data.txt	Thu May 15 13:02:31 2025 +0000
@@ -0,0 +1,15 @@
+RowID	File_1	File_2	File_3	File_4	File_5	File_6	File_7	File_8	File_9
+12	95.97218086	42.13959786	6.11506479	30.15646347	94.23814082	57.36969732	60.86347654	19.91409937	68.71355704
+14	59.66064371	64.93522126	32.32890474	40.14978233	2.891311477	32.96107785	66.75097997	0.920440008	24.22636581
+5	38.66154396	36.42452677	84.36958354	10.69964404	39.46448065	77.47277323	32.52771639	97.57285906	93.70459001
+36	32.97909046	43.52631758	59.83839323	69.87436805	98.12738555	4.751636512	47.47689026	41.3876903	67.78716531
+89	83.25413765	7.549367861	20.50592254	0.349459671	73.89946997	31.40388713	4.366449277	38.84340215	95.44116332
+965	71.74909204	40.82129731	21.73719426	32.67826786	93.7897543	92.54811762	57.16246361	98.97950241	38.61134734
+11	40.10030753	0.619259961	89.65946872	82.98278412	5.022064589	35.6513286	91.42743566	1.293400215	95.96990548
+2	82.35962922	25.48196256	47.51041934	71.45794006	90.23170047	34.52642435	88.0453423	63.2896977	28.82679247
+456	69.23813955	53.77332434	84.61367461	51.17705197	69.40525804	79.68268428	4.526957668	46.81700494	80.93458495
+68	88.78897848	85.84282896	51.53708603	71.26727107	94.03802875	77.02830433	50.12587615	30.93374275	15.06805862
+90	15.55940741	75.14719125	78.0377742	51.71345723	59.47299196	79.63191036	86.12417779	66.88062611	11.96856299
+23	51.55755631	26.99985192	85.64996749	74.54372275	97.09925394	47.50634659	43.94265016	60.73243208	89.94399967
+44	38.5549221	96.81614325	99.76966908	75.41077107	75.34246484	83.57435092	73.67006881	81.33326567	37.3100164
+567	72.74969753	17.0015972	64.01806032	37.71428705	41.30061893	84.5375675	44.21028268	9.076252458	50.67516692
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/boxplot_test_expDesign.txt	Thu May 15 13:02:31 2025 +0000
@@ -0,0 +1,10 @@
+SampleID	Condition	Replicate	Batch
+File_1	control	1	1
+File_2	control	2	1
+File_3	control	3	1
+File_4	treatment_A	1	1
+File_5	treatment_A	2	1
+File_6	treatment_A	3	2
+File_7	treatment_B	1	2
+File_8	treatment_B	2	2
+File_9	treatment_B	3	2
Binary file test-data/ggplot_heatmap_result1.pdf has changed
Binary file test-data/ggplot_histogram_result1.pdf has changed
Binary file test-data/ggplot_line_result1.pdf has changed
Binary file test-data/ggplot_pca_result1.pdf has changed
Binary file test-data/ggplot_point_result1.pdf has changed
Binary file test-data/ggplot_point_result2.pdf has changed
Binary file test-data/ggplot_point_result3.pdf has changed
Binary file test-data/ggplot_violin_result1.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/mtcars.txt	Thu May 15 13:02:31 2025 +0000
@@ -0,0 +1,33 @@
+brand	mpg	cyl	disp	hp	drat	wt	qsec	vs	am	gear	carb
+Mazda RX4	21	6	160	110	3.9	2.62	16.46	0	1	4	4
+Mazda RX4 Wag	21	6	160	110	3.9	2.875	17.02	0	1	4	4
+Datsun 710	22.8	4	108	93	3.85	2.32	18.61	1	1	4	1
+Hornet 4 Drive	21.4	6	258	110	3.08	3.215	19.44	1	0	3	1
+Hornet Sportabout	18.7	8	360	175	3.15	3.44	17.02	0	0	3	2
+Valiant	18.1	6	225	105	2.76	3.46	20.22	1	0	3	1
+Duster 360	14.3	8	360	245	3.21	3.57	15.84	0	0	3	4
+Merc 240D	24.4	4	146.7	62	3.69	3.19	20	1	0	4	2
+Merc 230	22.8	4	140.8	95	3.92	3.15	22.9	1	0	4	2
+Merc 280	19.2	6	167.6	123	3.92	3.44	18.3	1	0	4	4
+Merc 280C	17.8	6	167.6	123	3.92	3.44	18.9	1	0	4	4
+Merc 450SE	16.4	8	275.8	180	3.07	4.07	17.4	0	0	3	3
+Merc 450SL	17.3	8	275.8	180	3.07	3.73	17.6	0	0	3	3
+Merc 450SLC	15.2	8	275.8	180	3.07	3.78	18	0	0	3	3
+Cadillac Fleetwood	10.4	8	472	205	2.93	5.25	17.98	0	0	3	4
+Lincoln Continental	10.4	8	460	215	3	5.424	17.82	0	0	3	4
+Chrysler Imperial	14.7	8	440	230	3.23	5.345	17.42	0	0	3	4
+Fiat 128	32.4	4	78.7	66	4.08	2.2	19.47	1	1	4	1
+Honda Civic	30.4	4	75.7	52	4.93	1.615	18.52	1	1	4	2
+Toyota Corolla	33.9	4	71.1	65	4.22	1.835	19.9	1	1	4	1
+Toyota Corona	21.5	4	120.1	97	3.7	2.465	20.01	1	0	3	1
+Dodge Challenger	15.5	8	318	150	2.76	3.52	16.87	0	0	3	2
+AMC Javelin	15.2	8	304	150	3.15	3.435	17.3	0	0	3	2
+Camaro Z28	13.3	8	350	245	3.73	3.84	15.41	0	0	3	4
+Pontiac Firebird	19.2	8	400	175	3.08	3.845	17.05	0	0	3	2
+Fiat X1-9	27.3	4	79	66	4.08	1.935	18.9	1	1	4	1
+Porsche 914-2	26	4	120.3	91	4.43	2.14	16.7	0	1	5	2
+Lotus Europa	30.4	4	95.1	113	3.77	1.513	16.9	1	1	5	2
+Ford Pantera L	15.8	8	351	264	4.22	3.17	14.5	0	1	5	4
+Ferrari Dino	19.7	6	145	175	3.62	2.77	15.5	0	1	5	6
+Maserati Bora	15	8	301	335	3.54	3.57	14.6	0	1	5	8
+Volvo 142E	21.4	4	121	109	4.11	2.78	18.6	1	1	4	2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utils.r	Thu May 15 13:02:31 2025 +0000
@@ -0,0 +1,13 @@
+# Function for the data input
+load_data <- function(file_name, file_extension) {
+    if (file_extension == "csv") {
+        data_input <- read.csv(file_name, check.names = "false")
+    } else if (file_extension %in% c("tsv", "txt", "tabular")) {
+        data_input <- read.delim(file_name, sep = "\t", check.names = "false")
+    } else if (file_extension == "parquet") {
+        data_input <- arrow::read_parquet(file_name)
+    } else {
+        stop("Unsupported file format.")
+    }
+    return(data_input)
+}