This repository has been archived by the owner on Nov 22, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgraph-plotter-component.html
executable file
·322 lines (253 loc) · 24.2 KB
/
graph-plotter-component.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Graph Plotter Component – Livestock3D</title>
<!-- Meta -->
<meta name="description" content="Livestock3D – ">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Social -->
<meta property="article:author" content="Christian Kongsgaard" />
<meta property="article:section" content="posts" />
<meta property="article:published_time" content="2018-03-22" />
<meta property="og:type" content="article"/>
<meta property="og:title" content="Graph Plotter Component"/>
<meta property="og:description" content="Welcome to the second tutorial! In this tutorial we will create a component that can plot a graph with Matplotlib and NumPy. If you heard of Python, you have probably heard of NumPy as well. NumPy is a library that can handle numerical operations in Python. NumPy is super fast …"/>
<meta property="og:site_name" content="Livestock3D" />
<meta property="og:url" content="https://livestock3d.github.io/graph-plotter-component.html"/>
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Graph Plotter Component">
<meta name="twitter:description" content="Welcome to the second tutorial! In this tutorial we will create a component that can plot a graph with Matplotlib and NumPy. If you heard of Python, you have probably heard of NumPy as well. NumPy is a library that can handle numerical operations in Python. NumPy is super fast …">
<meta name="twitter:url" content="https://livestock3d.github.io/graph-plotter-component.html">
<!-- Feed -->
<!-- CSS -->
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Open+Sans:regular,bold">
<link rel="stylesheet" type="text/css" href="https://livestock3d.github.io/theme/css/w3.css">
<link rel="stylesheet" type="text/css" href="https://livestock3d.github.io/theme/css/style.css">
<link rel="stylesheet" type="text/css" href="https://livestock3d.github.io/theme/css/jqcloud.css">
<link rel="stylesheet" type="text/css" href="https://livestock3d.github.io/theme/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="https://livestock3d.github.io/theme/css/pygments-highlight-github.css">
<link rel="stylesheet" type="text/css" href="https://livestock3d.github.io/static/custom.css">
<!-- Icon -->
<link rel="shortcut icon" type="image/x-icon" href="https://livestock3d.github.io/favicon.ico">
<!-- JavaScript -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script src="https://livestock3d.github.io/theme/js/jqcloud.min.js"></script>
</head>
<body>
<div class="w3-row w3-card w3-white">
<header id="header">
<a href="https://livestock3d.github.io" id="header-logo" title="Home">CK</a>
<nav id="header-menu">
<ul>
<li><a href="https://livestock3d.github.io/pages/contributing-to-livestock.html">Contributing to Livestock</a></li>
<li><a href="https://livestock3d.github.io/pages/how-is-it-working.html">How is it Working?</a></li>
<li><a href="https://livestock3d.github.io/pages/welcome-to-livestock3d.html">Welcome to Livestock3D</a></li>
<li class="w3-bottombar w3-border-white w3-hover-border-green" style="font-weight: bold;"><a href="https://livestock3d.github.io/category/posts.html">posts</a></li>
</ul>
</nav>
</header>
</div>
<br><br><br>
<article>
<header class="w3-container col-main">
<h1>Graph Plotter Component</h1>
<div class="post-info">
<div class="w3-opacity w3-margin-right w3-margin-bottom" style="flex-grow: 1;">
<span><time datetime="2018-03-22T00:00:00+01:00">to 22 marts 2018</time> in <a href="https://livestock3d.github.io/category/posts.html" title="All articles in category posts">posts</a></span>
</div>
<div>
<span class="w3-tag w3-light-grey w3-text-green w3-hover-green">
<a href="https://livestock3d.github.io/tag/python.html" title="All articles with Python tag">#python</a>
</span>
<span class="w3-tag w3-light-grey w3-text-green w3-hover-green">
<a href="https://livestock3d.github.io/tag/grasshopper.html" title="All articles with Grasshopper tag">#grasshopper</a>
</span>
<span class="w3-tag w3-light-grey w3-text-green w3-hover-green">
<a href="https://livestock3d.github.io/tag/tutorial.html" title="All articles with Tutorial tag">#tutorial</a>
</span>
</div>
</div>
</header>
<br>
<div class="col-main w3-container">
<section id="content">
<p>Welcome to the second tutorial! In this tutorial we will create a component that can plot a graph with
<a href="https://matplotlib.org/">Matplotlib</a> and <a href="http://www.numpy.org/">NumPy</a>.
If you heard of Python, you have probably heard of NumPy as well. NumPy is a library that can handle numerical operations in Python.
NumPy is super fast and is relying heavily on C code, which makes it very hard (if not impossible) to use in IronPython.
Matplotlib is a plotting library, which works very well together with NumPy. The syntax of Matplotlib resemble Matlab's,
which makes it easy to use. </p>
<p>We will use the image viewer from Ladybug Tools to view the plot when finished, so make sure to download it first.
Ladybug Tools can be found <a href="http://www.food4rhino.com/app/ladybug-tools">here</a>. Important is to not download the [+] version, be get the legacy plugins.
If you are not going to use Ladybug Tools again, you can also just download the viewer <a href="https://github.com/mostaphaRoudsari/ladybug/raw/master/userObjects/Ladybug_ImageViewer.gha">here</a></p>
<h2>Grasshopper Component</h2>
<p>We will make the Graph Plotter component, by modifying the component from the first tutorial.
We just need to modify the component a little bit. You can start by opening the "1 - My First Component.gh" and save it as:
"Graph Plotter.gh". There we can start changing the component. We do not need the y input on the component, so you can start removing that.
Thereafter, double click the component and change the write_file function to:</p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">write_file</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="nb">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">x</span><span class="p">:</span>
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</pre></div>
<p>Here we loop over the input and saves each value on a new line in the data file.
We should change the file locations and the stuff inside the if statement:</p>
<div class="highlight"><pre><span></span><span class="c1"># Specify paths </span>
<span class="n">txt_file</span> <span class="o">=</span> <span class="n">folder</span> <span class="o">+</span> <span class="s1">'/data_file.txt'</span>
<span class="n">template_file</span> <span class="o">=</span> <span class="n">folder</span> <span class="o">+</span> <span class="s1">'/plot_graph_template.py'</span>
<span class="n">result_file</span> <span class="o">=</span> <span class="n">folder</span> <span class="o">+</span> <span class="s1">'/plot.png'</span>
<span class="c1"># Run functions</span>
<span class="k">if</span> <span class="n">run</span><span class="p">:</span>
<span class="n">write_file</span><span class="p">(</span><span class="n">txt_file</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="n">write_template</span><span class="p">(</span><span class="s1">'plot_graph'</span><span class="p">,</span> <span class="n">folder</span><span class="p">)</span>
<span class="n">run_template</span><span class="p">(</span><span class="n">py</span><span class="p">,</span> <span class="n">template_file</span><span class="p">)</span>
</pre></div>
<p>We are done coding the component now. The only thing missing is to change the x input to a list and add an output.
By default all inputs to the Grasshopper Python Scripts Component is set to "item". We do not want that, in this case.
You change it by right-clicking the x and a menu will appear. In the bottom you can see "List Access". Click on that.
<img alt="alt text" src="https://livestock3d.github.io/images/graph_plotter_1.png"></p>
<p>We also need the location of the plot, so create and extra output and call it: "results_file". Then the variable with the same
name will be outputted there.</p>
<p>The full script in the component, looks like this:</p>
<div class="highlight"><pre><span></span><span class="c1">#------------------------------------------------------------------------------#</span>
<span class="c1"># Imports</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">scriptcontext</span> <span class="kn">as</span> <span class="nn">sc</span>
<span class="kn">import</span> <span class="nn">subprocess</span>
<span class="kn">import</span> <span class="nn">livestock3d</span>
<span class="c1">#------------------------------------------------------------------------------#</span>
<span class="c1"># Functions</span>
<span class="k">def</span> <span class="nf">write_file</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="nb">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span>
<span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">x</span><span class="p">:</span>
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">write_template</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
<span class="n">livestock3d</span><span class="o">.</span><span class="n">pick_template</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">run_template</span><span class="p">(</span><span class="n">py_exe</span><span class="p">,</span> <span class="n">template_to_run</span><span class="p">):</span>
<span class="n">thread</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">([</span><span class="n">py_exe</span><span class="p">,</span> <span class="n">template_to_run</span><span class="p">])</span>
<span class="n">thread</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
<span class="n">thread</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">load_file</span><span class="p">(</span><span class="nb">file</span><span class="p">):</span>
<span class="nb">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span>
<span class="n">lines</span> <span class="o">=</span> <span class="nb">file</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="nb">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">return</span> <span class="n">lines</span>
<span class="k">def</span> <span class="nf">print_lines</span><span class="p">(</span><span class="n">lines</span><span class="p">):</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span>
<span class="c1">#------------------------------------------------------------------------------#</span>
<span class="c1"># Execution</span>
<span class="c1"># Get CPython path from the other component</span>
<span class="n">py</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">sc</span><span class="o">.</span><span class="n">sticky</span><span class="p">[</span><span class="s2">"PythonExe"</span><span class="p">])</span>
<span class="c1"># Make folder</span>
<span class="n">folder</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">'C:/livestock3d/data'</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">folder</span><span class="p">):</span>
<span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">folder</span><span class="p">)</span>
<span class="c1"># Specify paths </span>
<span class="n">txt_file</span> <span class="o">=</span> <span class="n">folder</span> <span class="o">+</span> <span class="s1">'/data_file.txt'</span>
<span class="n">template_file</span> <span class="o">=</span> <span class="n">folder</span> <span class="o">+</span> <span class="s1">'/plot_graph_template.py'</span>
<span class="n">result_file</span> <span class="o">=</span> <span class="n">folder</span> <span class="o">+</span> <span class="s1">'/plot.png'</span>
<span class="c1"># Run functions</span>
<span class="k">if</span> <span class="n">run</span><span class="p">:</span>
<span class="n">write_file</span><span class="p">(</span><span class="n">txt_file</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>
<span class="n">write_template</span><span class="p">(</span><span class="s1">'plot_graph'</span><span class="p">,</span> <span class="n">folder</span><span class="p">)</span>
<span class="n">run_template</span><span class="p">(</span><span class="n">py</span><span class="p">,</span> <span class="n">template_file</span><span class="p">)</span>
</pre></div>
<h2>Template</h2>
<p>The template can also be easily copied from my_first_template()
We just need to change the function we call from: "my_function()" to "plot_graph()"</p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">plot_graph</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Writes a template.</span>
<span class="sd"> :param path: Path to write it to.</span>
<span class="sd"> :type path: str</span>
<span class="sd"> :return: The file name</span>
<span class="sd"> """</span>
<span class="n">file_name</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">'/plot_graph_template.py'</span>
<span class="nb">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">path</span> <span class="o">+</span> <span class="n">file_name</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"# Imports</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"import sys</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"sys.path.insert(0, r'C:\livestock3d')</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"import livestock3d as ls</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"# Run function</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"ls.plot_graph()</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"# Announce that template finished and create out file</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">"print('Finished with template')</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="nb">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">return</span> <span class="n">file_name</span>
</pre></div>
<h2>CPython</h2>
<p>Let us open livestock3d.py at</p>
<blockquote>
<p>C:\livestock3d</p>
</blockquote>
<p>First we need to import Numpy and Matplotlib. We do that with:</p>
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="kn">as</span> <span class="nn">plt</span>
</pre></div>
<p>We create a new function at the bottom of the file called: "plot_graph()"
It takes a folder path as input. We can uses NumPy's loadtxt() to load our data. loadtxt() is a easy way to read a file,
containing data, even larger amounts. We store the data from the file in the variable called "y_values".
Besides y_values, we also need a series of x_values. We create a series from 0 to the length of y_values with NumPy's linspace.</p>
<p>In the end we use Matplotlib to plot out a graph and save it with the name "plot.png"</p>
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">plot_graph</span><span class="p">():</span>
<span class="n">y_values</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">loadtxt</span><span class="p">(</span><span class="s1">'data_file.txt'</span><span class="p">)</span>
<span class="n">x_values</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">y_values</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">y_values</span><span class="p">))</span>
<span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x_values</span><span class="p">,</span> <span class="n">y_values</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="s1">'plot.png'</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">None</span>
</pre></div>
<h2>Run Component</h2>
<p>Now we can head back to Grasshopper. Remember to restart Rhino before proceeding.
Now we just needs some numbers to put into the component. You can generate in whatever way you want. In the image below,
I have used a series component and an expression component to generate a polynominal. Connect the numbers to your component.
Drag Ladybug Tools' Image Viewer onto the canvas and connect "result_file" from the graph component to "imagePath".
Connect a boolean toggle to run and let the magic happen!</p>
<p><img alt="alt text" src="https://livestock3d.github.io/images/graph_plotter_2.png"></p>
</section>
<br><br><br>
<footer>
<div class="adjust-width">
<div id="author-block" class="w3-light-grey w3-border">
<div id="author-info">
<a href="http://ocni-dtu.github.io"><img style="width: 60px; height: 60px;" src="https://github.com/livestock3d/livestock3d.github.io/blob/master/images/profil.jpg" onerror="this.src='theme/images/avatar.png'" alt="Avatar"></a>
<div style="margin-left: 20px; margin-top: 15px;">
<a href="http://ocni-dtu.github.io"><span id="author-name" class="w3-hover-text-dark-grey">Christian Kongsgaard</span></a>
<p id="author-story">I'm a former Master Student of the Technical University of Denmark (DTU).
I'm developed Livestock for my thesis.</p>
</div>
</div>
</div>
</div>
<br><br><br>
<p style="font-size:10pt; font-style: italic;">Did you like this article? Share it with your friends!</p>
<div id="share" class="share">
<a href="http://www.facebook.com/sharer.php?u=https%3A//livestock3d.github.io/graph-plotter-component.html&t=Livestock3D%3A%20Graph%20Plotter%20Component" target="_blank" class="w3-btn w3-indigo">
<i class="fa fa-facebook"></i> <span>Facebook</span>
</a>
<a href="http://twitter.com/share?url=https%3A//livestock3d.github.io/graph-plotter-component.html&text=Livestock3D%3A%20Graph%20Plotter%20Component" target="_blank" class="w3-btn w3-blue">
<i class="fa fa-twitter"></i> <span>Twitter</span>
</a>
<a href="https://plus.google.com/share?url=https%3A//livestock3d.github.io/graph-plotter-component.html" onclick="javascript:window.open(this.href, '', 'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=600,width=600');return false;" class="w3-btn w3-red">
<i class="fa fa-google-plus"></i> <span>Google</span>
</a>
</div>
<br><br><br>
</footer>
</div>
</article>
<footer id="footer">
<div id="footer-copyright" class="w3-center w3-small w3-text-grey w3-padding-48">
<span>
©
2018 Christian Kongsgaard
</span>
</div>
</footer>
</body>
</html>