comparison plotly_blast_tool/plotlyblast.xml @ 3:82bcfcb60f97 draft default tip

Updated by re-generating with latest ToolFactory so png or html outputs can be requested. Output labels are informative too.
author fubar
date Fri, 04 Aug 2023 01:55:07 +0000
parents 47a7eeec4a19
children
comparison
equal deleted inserted replaced
2:47a7eeec4a19 3:82bcfcb60f97
1 <tool name="plotlyblast" id="plotlyblast" version="3.0"> 1 <tool name="plotlyblast" id="plotlyblast" version="3.0">
2 <!--Source in git at: https://github.com/fubar2/galaxy_tf_overlay--> 2 <!--Source in git at: https://github.com/fubar2/galaxy_tf_overlay-->
3 <!--Created by toolfactory@galaxy.org at 26/07/2023 17:31:09 using the Galaxy Tool Factory.--> 3 <!--Created by toolfactory@galaxy.org at 04/08/2023 10:36:02 using the Galaxy Tool Factory.-->
4 <description>Plotly plot generator</description> 4 <description>Plotly plot generator specialised for 25 column Galaxy blast search result tabular files</description>
5 <requirements> 5 <requirements>
6 <requirement type="package" version="1.5.3">pandas</requirement> 6 <requirement version="1.5.3" type="package">pandas</requirement>
7 <requirement type="package" version="5.9.0">plotly</requirement> 7 <requirement version="5.9.0" type="package">plotly</requirement>
8 <requirement version="0.2.1" type="package">python-kaleido</requirement>
8 </requirements> 9 </requirements>
9 <stdio> 10 <stdio>
10 <exit_code range="1:" level="fatal"/> 11 <exit_code range="1:" level="fatal"/>
11 </stdio> 12 </stdio>
12 <version_command><![CDATA[echo "3.0"]]></version_command> 13 <version_command><![CDATA[echo "3.0"]]></version_command>
25 --hovercol 26 --hovercol
26 "$hovercol" 27 "$hovercol"
27 --title 28 --title
28 "$title" 29 "$title"
29 --header 30 --header
30 "$header"]]></command> 31 "$header"
32 --image_type
33 "$outputimagetype"]]></command>
31 <configfiles> 34 <configfiles>
32 <configfile name="runme"><![CDATA[#raw 35 <configfile name="runme"><![CDATA[#raw
33 36
34 import argparse 37 import argparse
38 import shutil
35 import sys 39 import sys
36 import math 40 import math
37 import plotly.express as px 41 import plotly.express as px
38 import pandas as pd 42 import pandas as pd
39 # Ross Lazarus July 2023 43 # Ross Lazarus July 2023
47 a('--xcol',default='') 51 a('--xcol',default='')
48 a('--ycol',default='') 52 a('--ycol',default='')
49 a('--colourcol',default='') 53 a('--colourcol',default='')
50 a('--hovercol',default='') 54 a('--hovercol',default='')
51 a('--title',default='test blast plot') 55 a('--title',default='test blast plot')
56 a('--image_type',default='short_html')
52 args = parser.parse_args() 57 args = parser.parse_args()
53 df = pd.read_csv(args.input_tab, sep='\t') 58 df = pd.read_csv(args.input_tab, sep='\t')
54 NCOLS = df.columns.size 59 NCOLS = df.columns.size
55 MAXLEN = 30 # tricky way to truncate long axis tickmarks 60 MAXLEN = 30 # tricky way to truncate long axis tickmarks
56 defaultcols = ['col%d' % (x+1) for x in range(NCOLS)] 61 defaultcols = ['col%d' % (x+1) for x in range(NCOLS)]
67 if len(args.colourcol.strip()) == 0: 72 if len(args.colourcol.strip()) == 0:
68 fig = px.scatter(df, x=args.xcol, y=args.ycol, hover_name=args.hovercol) 73 fig = px.scatter(df, x=args.xcol, y=args.ycol, hover_name=args.hovercol)
69 else: 74 else:
70 fig = px.scatter(df, x=args.xcol, y=args.ycol, color=args.colourcol, hover_name=args.hovercol) 75 fig = px.scatter(df, x=args.xcol, y=args.ycol, color=args.colourcol, hover_name=args.hovercol)
71 if args.title: 76 if args.title:
72 fig.update_layout(title=dict(text=args.title, font=dict(size=40))) 77 ftitle=dict(text=args.title, font=dict(size=40))
73 78 fig.update_layout(title=ftitle)
74
75 for scatter in fig.data: 79 for scatter in fig.data:
76 scatter['x'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['x']] 80 scatter['x'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['x']]
77 scatter['y'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['y']] 81 scatter['y'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['y']]
78 if len(args.colourcol.strip()) == 0: 82 if len(args.colourcol.strip()) == 0:
79 sl = str(scatter['legendgroup']) 83 sl = str(scatter['legendgroup'])
80 if len(sl) > MAXLEN: 84 if len(sl) > MAXLEN:
81 scatter['legendgroup'] = sl[:MAXLEN] 85 scatter['legendgroup'] = sl[:MAXLEN]
82 fig.write_html(args.htmlout) 86 if args.image_type == "short_html":
87 fig.write_html(args.htmlout, full_html=False, include_plotlyjs='cdn')
88 elif args.image_type == "long_html":
89 fig.write_html(args.htmlout)
90 elif args.image_type == "small_png":
91 ht = 768
92 wdth = 1024
93 fig.write_image('plotly.png', height=ht, width=wdth)
94 shutil.copyfile('plotly.png', args.htmlout)
95 else:
96 ht = 1200
97 wdth = 1920
98 fig.write_image('plotly.png', height=ht, width=wdth)
99 shutil.copyfile('plotly.png', args.htmlout)
100
83 101
84 102
85 #end raw]]></configfile> 103 #end raw]]></configfile>
86 </configfiles> 104 </configfiles>
87 <inputs> 105 <inputs>
88 <param name="input_tab" type="data" optional="false" label="Tabular input file to plot" help="" format="tabular" multiple="false"/> 106 <param name="input_tab" type="data" optional="false" label="Tabular input file to plot" help="" format="tabular" multiple="false"/>
89 <param name="xcol" type="text" value="qaccver" label="x axis for plat" help=""/> 107 <param name="xcol" type="text" value="qaccver" label="x axis for plot" help=""/>
90 <param name="ycol" type="text" value="bitscore" label="y axis for plot" help=""/> 108 <param name="ycol" type="text" value="bitscore" label="y axis for plot" help=""/>
91 <param name="colourcol" type="text" value="piden" label="column containing a groupable variable for colour. Default none." help="Adds a legend so choose wisely "/> 109 <param name="colourcol" type="text" value="piden" label="column containing a groupable variable for colour. Default none." help="Adds a legend so choose wisely "/>
92 <param name="hovercol" type="text" value="qseq" label="columname for hover string" help=""/> 110 <param name="hovercol" type="text" value="qseq" label="columname for hover string" help=""/>
93 <param name="title" type="text" value="Qaccver by bitscore coloured by pident. Hover shows blast match." label="Title for the plot" help="Special characters will probably be escaped so do not use them"/> 111 <param name="title" type="text" value="Qaccver by bitscore coloured by pident. Hover shows blast match." label="Title for the plot" help="Special characters will probably be escaped so do not use them"/>
94 <param name="header" type="text" value="qaccver,saccver,piden,length,mismatch,gapopen,qstart,qend,sstart,send,evalue,bitscore,sallseqid,score,nident,positive,gaps,ppos,qframe,sframe,qseq,sseq,qlen,slen,salltitles" 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."/> 112 <param name="header" type="text" value="qaccver,saccver,piden,length,mismatch,gapopen,qstart,qend,sstart,send,evalue,bitscore,sallseqid,score,nident,positive,gaps,ppos,qframe,sframe,qseq,sseq,qlen,slen,salltitles" 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."/>
113 <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.">
114 <option value="short_html">Short HTML interactive - requires network connection to download 3MB javascript</option>
115 <option value="long_html">Long HTML for stand-alone viewing where network access to libraries is not available.</option>
116 <option value="large_png">Large (1920x1200) png image - not interactive so hover column ignored</option>
117 <option value="small_png">Small (1024x768) png image - not interactive so hover column ignored</option>
118 </param>
95 </inputs> 119 </inputs>
96 <outputs> 120 <outputs>
97 <data name="htmlout" format="html" label="htmlout" hidden="false"/> 121 <data name="htmlout" format="html" label="Plotlyblast $title on $input_tab.element_identifier" hidden="false">
122 <change_format>
123 <when input="outputimagetype" format="png" value="small_png"/>
124 <when input="outputimagetype" format="png" value="large_png"/>
125 </change_format>
126 </data>
98 </outputs> 127 </outputs>
99 <tests> 128 <tests>
100 <test> 129 <test>
101 <output name="htmlout" value="htmlout_sample" compare="sim_size" delta="5000"/> 130 <output name="htmlout" value="htmlout_sample" compare="sim_size" delta="5000"/>
102 <param name="input_tab" value="input_tab_sample"/> 131 <param name="input_tab" value="input_tab_sample"/>
104 <param name="ycol" value="bitscore"/> 133 <param name="ycol" value="bitscore"/>
105 <param name="colourcol" value="piden"/> 134 <param name="colourcol" value="piden"/>
106 <param name="hovercol" value="qseq"/> 135 <param name="hovercol" value="qseq"/>
107 <param name="title" value="Qaccver by bitscore coloured by pident. Hover shows blast match."/> 136 <param name="title" value="Qaccver by bitscore coloured by pident. Hover shows blast match."/>
108 <param name="header" value="qaccver,saccver,piden,length,mismatch,gapopen,qstart,qend,sstart,send,evalue,bitscore,sallseqid,score,nident,positive,gaps,ppos,qframe,sframe,qseq,sseq,qlen,slen,salltitles"/> 137 <param name="header" value="qaccver,saccver,piden,length,mismatch,gapopen,qstart,qend,sstart,send,evalue,bitscore,sallseqid,score,nident,positive,gaps,ppos,qframe,sframe,qseq,sseq,qlen,slen,salltitles"/>
138 <param name="outputimagetype" value="short_html"/>
109 </test> 139 </test>
110 </tests> 140 </tests>
111 <help><![CDATA[ 141 <help><![CDATA[
112 142
113 This is a specialised version of a generic tabular file plotter tool plotlytabular 143 This is a specialised version of a generic tabular file plotter tool plotlytabular
114 144
145 PNG image outputs are not interactive but best for very large numbers of data points. Hover column will be ignored.
146
147 HTML interactive plots are best for a few thousand data points at most because
148
149 the hover information becomes uncontrollable with very dense points.
150
151 Using the shorter format HTML relies on internet access when viewed, and saves 3MB of javascript being embedded.
152
153 The long format is useful if potentially viewed offline.
154
115 155
116 156
117 .. class:: warningmark 157 .. class:: warningmark
118 158
119 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. 159 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.
128 168
129 ---- 169 ----
130 170
131 171
132 172
133 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. 173 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.
134 174
135 175
136 176
137 Assumes you want a hover display for an interactive plot to be informative 177 Assumes you want a hover display for an interactive plot to be informative
138 178
156 196
157 Relies on Plotly python code released under the MIT licence: https://github.com/plotly/plotly.py/blob/master/LICENSE.txt 197 Relies on Plotly python code released under the MIT licence: https://github.com/plotly/plotly.py/blob/master/LICENSE.txt
158 198
159 199
160 200
161 .. image:: pbsample.png 201
162 202
163 :height: 400 203
164
165 :width: 400
166
167
168 204
169 ------ 205 ------
170 206
171 207
172 Script:: 208 Script::
173 209
174 import argparse 210 import argparse
211 import shutil
175 import sys 212 import sys
176 import math 213 import math
177 import plotly.express as px 214 import plotly.express as px
178 import pandas as pd 215 import pandas as pd
179 # Ross Lazarus July 2023 216 # Ross Lazarus July 2023
187 a('--xcol',default='') 224 a('--xcol',default='')
188 a('--ycol',default='') 225 a('--ycol',default='')
189 a('--colourcol',default='') 226 a('--colourcol',default='')
190 a('--hovercol',default='') 227 a('--hovercol',default='')
191 a('--title',default='test blast plot') 228 a('--title',default='test blast plot')
229 a('--image_type',default='short_html')
192 args = parser.parse_args() 230 args = parser.parse_args()
193 df = pd.read_csv(args.input_tab, sep='\t') 231 df = pd.read_csv(args.input_tab, sep='\t')
194 NCOLS = df.columns.size 232 NCOLS = df.columns.size
195 MAXLEN = 30 # tricky way to truncate long axis tickmarks 233 MAXLEN = 30 # tricky way to truncate long axis tickmarks
196 defaultcols = ['col%d' % (x+1) for x in range(NCOLS)] 234 defaultcols = ['col%d' % (x+1) for x in range(NCOLS)]
207 if len(args.colourcol.strip()) == 0: 245 if len(args.colourcol.strip()) == 0:
208 fig = px.scatter(df, x=args.xcol, y=args.ycol, hover_name=args.hovercol) 246 fig = px.scatter(df, x=args.xcol, y=args.ycol, hover_name=args.hovercol)
209 else: 247 else:
210 fig = px.scatter(df, x=args.xcol, y=args.ycol, color=args.colourcol, hover_name=args.hovercol) 248 fig = px.scatter(df, x=args.xcol, y=args.ycol, color=args.colourcol, hover_name=args.hovercol)
211 if args.title: 249 if args.title:
212 ftitle=dict(text=args.title, font=dict(size=40), automargin=True) 250 ftitle=dict(text=args.title, font=dict(size=40))
213 fig.update_layout(title=ftitle) 251 fig.update_layout(title=ftitle)
214 for scatter in fig.data: 252 for scatter in fig.data:
215 scatter['x'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['x']] 253 scatter['x'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['x']]
216 scatter['y'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['y']] 254 scatter['y'] = [str(x)[:MAXLEN] + '..' if len(str(x)) > MAXLEN else x for x in scatter['y']]
217 if len(args.colourcol.strip()) == 0: 255 if len(args.colourcol.strip()) == 0:
218 sl = str(scatter['legendgroup']) 256 sl = str(scatter['legendgroup'])
219 if len(sl) > MAXLEN: 257 if len(sl) > MAXLEN:
220 scatter['legendgroup'] = sl[:MAXLEN] 258 scatter['legendgroup'] = sl[:MAXLEN]
221 fig.write_html(args.htmlout) 259 if args.image_type == "short_html":
260 fig.write_html(args.htmlout, full_html=False, include_plotlyjs='cdn')
261 elif args.image_type == "long_html":
262 fig.write_html(args.htmlout)
263 elif args.image_type == "small_png":
264 ht = 768
265 wdth = 1024
266 fig.write_image('plotly.png', height=ht, width=wdth)
267 shutil.copyfile('plotly.png', args.htmlout)
268 else:
269 ht = 1200
270 wdth = 1920
271 fig.write_image('plotly.png', height=ht, width=wdth)
272 shutil.copyfile('plotly.png', args.htmlout)
222 273
223 ]]></help> 274 ]]></help>
224 <citations> 275 <citations>
225 <citation type="doi">10.1093/bioinformatics/bts573</citation> 276 <citation type="doi">10.1093/bioinformatics/bts573</citation>
226 </citations> 277 </citations>