diff plotly_tabular_tool/plotlytabular.xml @ 3:51a0c2e0fbdf draft

Updated with latest ToolFactory with change_format for outputs so can make a png or html and it has an informative label since on $foo can be used.
author fubar
date Fri, 04 Aug 2023 02:00:28 +0000
parents 08cc7a481af8
children e2d2b080bae3
line wrap: on
line diff
--- a/plotly_tabular_tool/plotlytabular.xml	Fri Jul 28 06:01:53 2023 +0000
+++ b/plotly_tabular_tool/plotlytabular.xml	Fri Aug 04 02:00:28 2023 +0000
@@ -1,10 +1,11 @@
 <tool name="plotlytabular" id="plotlytabular" version="3.0">
   <!--Source in git at: https://github.com/fubar2/galaxy_tf_overlay-->
-  <!--Created by toolfactory@galaxy.org at 28/07/2023 15:52:28 using the Galaxy Tool Factory.-->
-  <description>Plotly plot generator for any small-ish Galaxy tabular data.</description>
+  <!--Created by toolfactory@galaxy.org at 04/08/2023 10:38:13 using the Galaxy Tool Factory.-->
+  <description>Plotly plot generator for Galaxy tabular data.</description>
   <requirements>
     <requirement version="1.5.3" type="package">pandas</requirement>
     <requirement version="5.9.0" type="package">plotly</requirement>
+    <requirement version="0.2.1" type="package">python-kaleido</requirement>
   </requirements>
   <stdio>
     <exit_code range="1:" level="fatal"/>
@@ -27,11 +28,14 @@
 --title
 "$title"
 --header
-"$header"]]></command>
+"$header"
+--image_type
+"$outputimagetype"]]></command>
   <configfiles>
     <configfile name="runme"><![CDATA[#raw
 
 import argparse
+import shutil
 import sys
 import math
 import plotly.express as px
@@ -48,6 +52,7 @@
 a('--colourcol',default='')
 a('--hovercol',default='')
 a('--title',default='Default plot title')
+a('--image_type',default='short_html')
 args = parser.parse_args()
 isColour = False
 isHover = False
@@ -91,7 +96,20 @@
         sl = str(scatter['legendgroup'])
         if len(sl) > MAXLEN:
             scatter['legendgroup'] = sl[:MAXLEN]
-fig.write_html(args.htmlout)
+if args.image_type == "short_html":
+    fig.write_html(args.htmlout, full_html=False, include_plotlyjs='cdn')
+elif args.image_type == "long_html":
+    fig.write_html(args.htmlout)
+elif args.image_type == "small_png":
+    ht = 768
+    wdth = 1024
+    fig.write_image('plotly.png', height=ht, width=wdth)
+    shutil.copyfile('plotly.png', args.htmlout)
+else:
+    ht = 1200
+    wdth = 1920
+    fig.write_image('plotly.png', height=ht, width=wdth)
+    shutil.copyfile('plotly.png', args.htmlout)
 
 
 #end raw]]></configfile>
@@ -101,12 +119,23 @@
     <param name="xcol" type="text" value="sepal_length" label="x axis for plot" help="Use a column name from the header if the file has one, or use one from the list supplied below, or use col1....colN otherwise to select the correct column"/>
     <param name="ycol" type="text" value="sepal_width" label="y axis for plot" help="Use a column name from the header if the file has one, or use one from the list supplied below, or use col1....colN otherwise to select the correct column"/>
     <param name="colourcol" type="text" value="petal_width" label="column containing a groupable variable for colour. Default none." help="Adds a legend so choose wisely "/>
-    <param name="hovercol" type="text" value="species_id" label="columname for hover string" help="Use a column name from the header if the file has one, or use one from the list supplied below, or use col1....colN otherwise to select the correct column"/>
+    <param name="hovercol" type="text" value="species" label="columname for hover string" help="Use a column name from the header if the file has one, or use one from the list supplied below, or use col1....colN otherwise to select the correct column"/>
     <param name="title" type="text" value="Iris data" label="Title for the plot" help="Special characters will probably be escaped so do not use them"/>
-    <param name="header" type="text" value="" label="Use this comma delimited list of column header names for this tabular file. Default is None when col1...coln will be used" help="Default for Galaxy blast outputs with 25 columns. The column names supplied for xcol, ycol, hover and colour MUST match either the supplied list, or if none, col1...coln."/>
+    <param name="header" type="text" value="" label="Use this comma delimited list of column header names for this tabular file. Default is None when col1...coln will be used" help="The column names supplied for xcol, ycol, hover and colour MUST match either this supplied list, or if none, col1...coln."/>
+    <param name="outputimagetype" type="select" label="Select the output format for this plot image" help="Small and large png are not interactive but best for many (__gt__10k) points. Stand-alone HTML includes 3MB of javascript. Short form HTML gets it the usual way so can be cut and paste into documents.">
+      <option value="short_html">Short HTML interactive format</option>
+      <option value="long_html">Long HTML for stand-alone viewing where network access to libraries is not available.</option>
+      <option value="large_png">Large (1920x1200) png image - not interactive so hover column ignored</option>
+      <option value="small_png">small (1024x768) png image - not interactive so hover column ignored</option>
+    </param>
   </inputs>
   <outputs>
-    <data name="htmlout" format="html" label="htmlout" hidden="false"/>
+    <data name="htmlout" format="html" label="Plotlytabular $title on $input_tab.element_identifier" hidden="false">
+      <change_format>
+        <when input="outputimagetype" format="png" value="small_png"/>
+        <when input="outputimagetype" format="png" value="large_png"/>
+      </change_format>
+    </data>
   </outputs>
   <tests>
     <test>
@@ -115,26 +144,37 @@
       <param name="xcol" value="sepal_length"/>
       <param name="ycol" value="sepal_width"/>
       <param name="colourcol" value="petal_width"/>
-      <param name="hovercol" value="species_id"/>
+      <param name="hovercol" value="species"/>
       <param name="title" value="Iris data"/>
       <param name="header" value=""/>
+      <param name="outputimagetype" value="short_html"/>
     </test>
   </tests>
   <help><![CDATA[
 
 This is a generic version of the plotlyblast specific blastn Galaxy search output file plotter.
 
+PNG images are not interactive but best for very large numbers of data points. Hover column will be ignored.
 
+HTML interactive plots are best for a few thousand data points at most because
 
-.. class:: warningmark
+the hover information becomes uncontrollable with very dense points.
 
-NOTE: Long strings in x and y tickmarks WILL BE TRUNCATED if they are too long - ".." is added to indicate truncation - otherwise some plots are squished.
+Using the shorter format HTML relies on internet access when viewed, and saves 3MB of javascript being embedded.
+
+The long format is useful if potentially viewed offline.
 
 
 
 .. class:: warningmark
 
-NOTE: Columns with very small scientific notation floats will need to be pre-scaled in a way that doesn't confuse plotly.express with their values.
+Long strings in x and y tickmarks WILL BE TRUNCATED if they are too long - ".." is added to indicate truncation - otherwise some plots are squished.
+
+
+
+.. class:: warningmark
+
+Columns with very small scientific notation floats will need to be pre-scaled in a way that doesn't confuse plotly.express with their values.
 
 
 
@@ -142,15 +182,17 @@
 
 
 
-The main reason to run this tool is to have an interactive hover text specified so it appears when hovering over each data point to supply useful information. 
+This tool can plot an interactive scatter plot with a hover text column specified, that appears when hovering over each data point, to supply useful additional information. 
+
+It is only useful with a relatively small number of points when they can be distinguished. If many thousands, the density makes them relatively useless so use png output and
+
+forget the hover text.
 
 
 
-Assumes you want a hover display for an interactive plot to be informative
-
+Column names are auto-generated as col1,...coln *unless* a comma separated list of column names is supplied as the header parameter, *or* pandas can 
 
-
-Column names are auto-generated as col1,...coln unless a comma separated list of column names is supplied as the header parameter.
+find the values supplied as parameters by the user in the first row of data. This sounds more complex than it is.
 
 
 
@@ -178,6 +220,7 @@
 Script::
 
     import argparse
+    import shutil
     import sys
     import math
     import plotly.express as px
@@ -194,6 +237,7 @@
     a('--colourcol',default='')
     a('--hovercol',default='')
     a('--title',default='Default plot title')
+    a('--image_type',default='short_html')
     args = parser.parse_args()
     isColour = False
     isHover = False
@@ -237,7 +281,20 @@
             sl = str(scatter['legendgroup'])
             if len(sl) > MAXLEN:
                 scatter['legendgroup'] = sl[:MAXLEN]
-    fig.write_html(args.htmlout)
+    if args.image_type == "short_html":
+        fig.write_html(args.htmlout, full_html=False, include_plotlyjs='cdn')
+    elif args.image_type == "long_html":
+        fig.write_html(args.htmlout)
+    elif args.image_type == "small_png":
+        ht = 768
+        wdth = 1024
+        fig.write_image('plotly.png', height=ht, width=wdth)
+        shutil.copyfile('plotly.png', args.htmlout)
+    else:
+        ht = 1200
+        wdth = 1920
+        fig.write_image('plotly.png', height=ht, width=wdth)
+        shutil.copyfile('plotly.png', args.htmlout)
 
 ]]></help>
   <citations>