ruby-gr 0.0.24 → 0.61.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +2 -2
- data/README.md +54 -22
- data/lib/gr/ffi.rb +15 -1
- data/lib/gr/plot.rb +116 -67
- data/lib/gr.rb +242 -32
- data/lib/gr3/ffi.rb +7 -1
- data/lib/gr3.rb +28 -8
- data/lib/gr_commons/define_methods.rb +2 -2
- data/lib/gr_commons/fiddley.rb +1 -1
- data/lib/gr_commons/gr_common_utils.rb +2 -2
- data/lib/gr_commons/gr_commons.rb +2 -2
- data/lib/gr_commons/gr_lib.rb +104 -0
- data/lib/gr_commons/gr_logger.rb +24 -12
- data/lib/gr_commons/jupyter_support.rb +2 -2
- data/lib/gr_commons/{extern.rb → try_extern.rb} +1 -1
- data/lib/gr_commons/version.rb +1 -1
- data/lib/grm/ffi.rb +8 -3
- data/lib/grm.rb +22 -8
- metadata +5 -89
- data/lib/gr_commons/search_shared_library.rb +0 -74
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bacbabae072c86f3b7b227a82043d4ff8e0aaad4df9da3234582270491790d4c
|
|
4
|
+
data.tar.gz: 033e92c26281e32cc5b4a9d42d79c56953fac00b1da5a9479b472ce94f77c995
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f181ff21a1254fd0791ec2e8862586be634b2ecdb4e5bec76298e22b5bf7dd59e727159cfc9c9b2fde6fc739b99cb889f25041b3592dad93ca2c1b183cb8153e
|
|
7
|
+
data.tar.gz: b4441cc2dbc8f2e7067d80c13407feff556f8fcb5cdb993b936df797ccfd8edd67c9db98a17fff9bf62c7a2f546877e065ba38f6bd0752e2d743473c5cbbeebd
|
data/LICENSE.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2019 kojix2
|
|
4
|
-
Copyright (c) 2019 Red Data Tools
|
|
3
|
+
Copyright (c) 2019 - present kojix2
|
|
4
|
+
Copyright (c) 2019 - present Red Data Tools
|
|
5
5
|
|
|
6
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
7
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# GR.rb
|
|
2
2
|
|
|
3
|
-
[](https://rubygems.org/gems/ruby-gr)
|
|
4
|
+
[](https://github.com/red-data-tools/GR.rb/actions)
|
|
4
5
|
[](https://gitter.im/red-data-tools/en)
|
|
5
6
|
[](https://rubydoc.info/gems/ruby-gr)
|
|
6
7
|
|
|
@@ -31,16 +32,15 @@ First, [install GR](#gr-installation). Then install `ruby-gr` gem.
|
|
|
31
32
|
```sh
|
|
32
33
|
gem install ruby-gr
|
|
33
34
|
```
|
|
35
|
+
Note: If you are using [RubyInstaller](https://rubyinstaller.org/) (Windows), pacman will automatically install [mingw-w64-gr](https://packages.msys2.org/base/mingw-w64-gr).
|
|
34
36
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
Set environment variable `GRDIR`.
|
|
37
|
+
Set environment variable `GRDIR`.
|
|
38
38
|
|
|
39
39
|
```sh
|
|
40
40
|
export GRDIR="/your/path/to/gr"
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
If you use package managers to install GR, [pkg-config](https://github.com/ruby-gnome/pkg-config) may automatically detect the shared library location without specifying the `GRDIR` environment variable.
|
|
43
|
+
If you use package managers to install GR, [pkg-config](https://github.com/ruby-gnome/pkg-config) may automatically detect the shared library location without specifying the `GRDIR` environment variable.
|
|
44
44
|
|
|
45
45
|
## Quick Start
|
|
46
46
|
|
|
@@ -79,7 +79,7 @@ GR.plot(
|
|
|
79
79
|
)
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
-
Save in PNG format.
|
|
82
|
+
Save the figure in PNG format.
|
|
83
83
|
|
|
84
84
|
```ruby
|
|
85
85
|
GR.savefig("figure.png")
|
|
@@ -87,17 +87,17 @@ GR.savefig("figure.png")
|
|
|
87
87
|
|
|
88
88
|
## API Overview
|
|
89
89
|
|
|
90
|
-
There are two different approaches
|
|
90
|
+
There are two different approaches when plotting with GR.rb. One is to call Matlab-like APIs. The other is to call GR/GR3 native functions.
|
|
91
91
|
|
|
92
|
-
#### GR::Plot - A simple, matlab-style API.
|
|
92
|
+
#### GR::Plot - A simple, matlab-style API.
|
|
93
93
|
|
|
94
94
|
```ruby
|
|
95
95
|
require 'gr/plot'
|
|
96
96
|
GR.plot(x, y)
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
|
|
100
|
-
Some GR module methods are
|
|
99
|
+
Below are a list of available functions. See [GR.rb Wiki](https://github.com/red-data-tools/GR.rb/wiki) for details.
|
|
100
|
+
Some GR module methods are overwritten.
|
|
101
101
|
|
|
102
102
|
[`plot`](../../wiki/Plotting-functions#plot)
|
|
103
103
|
[`step`](../../wiki/Plotting-functions#step)
|
|
@@ -123,8 +123,6 @@ Some GR module methods are overridden.
|
|
|
123
123
|
[`imshow`](../../wiki/Plotting-functions#imshow)
|
|
124
124
|
[`isosurface`](../../wiki/Plotting-functions#isosurface)
|
|
125
125
|
|
|
126
|
-
We are planning to prepare a [more object-oriented interface](https://github.com/kojix2/GRUtils.rb) based on [GRUtils.jl](https://github.com/heliosdrm/GRUtils.jl) in the future.
|
|
127
|
-
|
|
128
126
|
#### GR - A module for calling native GR functions.
|
|
129
127
|
|
|
130
128
|
2-D Plots and common 3-D Plots.
|
|
@@ -148,13 +146,23 @@ require 'gr3'
|
|
|
148
146
|
GR3.cameralookat(-3, 2, -2, 0, 0, 0, 0, 0, -1)
|
|
149
147
|
```
|
|
150
148
|
|
|
149
|
+
### Using GR.rb non-interactively
|
|
150
|
+
|
|
151
|
+
Both APIs will by default start a Qt based window to show the result of the last call.
|
|
152
|
+
This behavior is caused by GR itself as it will [implicitly generate output to a file or application](https://gr-framework.org/workstations.html#no-output).
|
|
153
|
+
If you want to use GR.rb non-interactively, eg., as part of a static site build, you can do this by setting the environment variable `GKS_WSTYPE`to `100`.
|
|
154
|
+
|
|
155
|
+
```sh
|
|
156
|
+
export GKS_WSTYPE=100
|
|
157
|
+
```
|
|
158
|
+
|
|
151
159
|
## Documentation
|
|
152
160
|
|
|
153
161
|
- [GR.rb Wiki](https://github.com/red-data-tools/GR.rb/wiki)
|
|
154
162
|
- [GR Framework](https://gr-framework.org/)
|
|
155
163
|
- [GR.rb API Documentation](https://rubydoc.info/gems/ruby-gr)
|
|
156
164
|
|
|
157
|
-
Although GR.rb adds methods dynamically, we try our best to provide a complete yard document.
|
|
165
|
+
Although GR.rb adds methods dynamically, we try our best to provide a complete yard document. If you want to see more up-to-date information, we recommend using the official GR reference.
|
|
158
166
|
|
|
159
167
|
## GR Installation
|
|
160
168
|
|
|
@@ -168,13 +176,13 @@ Set environment variable GRDIR.
|
|
|
168
176
|
export GRDIR="your/path/to/gr"
|
|
169
177
|
```
|
|
170
178
|
|
|
171
|
-
|
|
179
|
+
macOS : Please the section "How to open apps from un-notarized or unidentified developers" in the Apple documentation ["Safely open apps on your Mac"](https://support.apple.com/en-us/HT202491).
|
|
172
180
|
|
|
173
181
|
### Using package managers
|
|
174
182
|
|
|
175
183
|
* The third party GR packages for Mac, Linux and Windows are available (for advanced users).
|
|
176
184
|
* If you find any problem, please report the issue [here](https://github.com/red-data-tools/GR.rb/issues).
|
|
177
|
-
* Note: These packages may not have some features
|
|
185
|
+
* Note: These packages may not have some features such as video output.
|
|
178
186
|
|
|
179
187
|
#### Mac - Homebrew
|
|
180
188
|
|
|
@@ -182,20 +190,29 @@ export GRDIR="your/path/to/gr"
|
|
|
182
190
|
brew install libgr
|
|
183
191
|
```
|
|
184
192
|
|
|
185
|
-
|
|
193
|
+
Set the workstation type to gksqt.
|
|
186
194
|
|
|
187
|
-
|
|
195
|
+
```sh
|
|
196
|
+
export GKS_WSTYPE=411 # gksqt (recommended)
|
|
197
|
+
```
|
|
188
198
|
|
|
189
|
-
|
|
199
|
+
#### Linux - openSUSE Build service
|
|
190
200
|
|
|
191
|
-
|
|
201
|
+
GR releases are also available from the [openSUSE Build service](https://software.opensuse.org//download.html?project=science%3Agr-framework&package=gr) for CentOS, Debian, Fedora openSUSE and Ubuntu. Obtain a packaged release [here](https://software.opensuse.org//download.html?project=science%3Agr-framework&package=gr).
|
|
192
202
|
|
|
193
|
-
|
|
203
|
+
```sh
|
|
204
|
+
export GRDIR="/usr/gr" # Check the location with `dpkg -L gr`
|
|
205
|
+
```
|
|
194
206
|
|
|
195
|
-
|
|
207
|
+
#### Windows - MSYS2
|
|
208
|
+
|
|
209
|
+
If you are using Rubyinstaller, pacman will automatically install [mingw-w64-gr](https://packages.msys2.org/base/mingw-w64-gr) when the gem is installed.
|
|
196
210
|
|
|
197
211
|
## Contributing
|
|
198
212
|
|
|
213
|
+
GR.rb is a library under development, so even small improvements like fixing typos are welcome!
|
|
214
|
+
Please feel free to send us your PR.
|
|
215
|
+
|
|
199
216
|
* [Report bugs](https://github.com/red-data-tools/GR.rb/issues)
|
|
200
217
|
* Fix bugs and [submit pull requests](https://github.com/red-data-tools/GR.rb/pulls)
|
|
201
218
|
* Write, clarify, or fix documentation
|
|
@@ -203,7 +220,22 @@ GR.rb will be the default backend for [Charty](https://github.com/red-data-tools
|
|
|
203
220
|
* Update GR packages ( Homebrew, MinGW, red-data-tools )
|
|
204
221
|
* Create visualization tools based on GR.rb
|
|
205
222
|
|
|
223
|
+
To get started with development:
|
|
224
|
+
|
|
225
|
+
```sh
|
|
226
|
+
git clone https://github.com/red-data-tools/GR.rb
|
|
227
|
+
cd GR.rb
|
|
228
|
+
bundle install
|
|
229
|
+
bundle exec rake test
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
* [I'm new to Ruby](https://github.com/red-data-tools/GR.rb/wiki/I%27m-new-to-Ruby)
|
|
233
|
+
|
|
234
|
+
## Future plans
|
|
235
|
+
|
|
236
|
+
* Creating a backend for [Charty](https://github.com/red-data-tools/charty).
|
|
237
|
+
* [Object-oriented interface](https://github.com/kojix2/GRUtils.rb) based on [GRUtils.jl](https://github.com/heliosdrm/GRUtils.jl).
|
|
238
|
+
|
|
206
239
|
## Acknowledgements
|
|
207
240
|
|
|
208
241
|
We would like to thank Josef Heinen, the creator of [GR](https://github.com/sciapp/gr) and [GR.jl](https://github.com/jheinen/GR.jl), Florian Rhiem, the creator of [python-gr](https://github.com/sciapp/python-gr), and all [GR](https://github.com/sciapp/gr) developers.
|
|
209
|
-
|
data/lib/gr/ffi.rb
CHANGED
|
@@ -15,7 +15,7 @@ module GR
|
|
|
15
15
|
raise LoadError, 'Could not find GR Framework'
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
-
extend GRCommons::
|
|
18
|
+
extend GRCommons::TryExtern
|
|
19
19
|
|
|
20
20
|
# https://github.com/sciapp/gr/blob/master/lib/gr/gr.h
|
|
21
21
|
# keep same order
|
|
@@ -41,6 +41,8 @@ module GR
|
|
|
41
41
|
'int, int, int, int, int, int, int *)'
|
|
42
42
|
try_extern 'void gr_polarcellarray(double, double, double, double, double, double, ' \
|
|
43
43
|
'int, int, int, int, int, int, int *)'
|
|
44
|
+
try_extern 'void gr_nonuniformpolarcellarray(double, double, double *, double *, ' \
|
|
45
|
+
'int, int, int, int, int, int, int *);'
|
|
44
46
|
try_extern 'void gr_gdp(int, double *, double *, int, int, int *)'
|
|
45
47
|
try_extern 'void gr_spline(int, double *, double *, int, int)'
|
|
46
48
|
try_extern 'void gr_gridit(int, double *, double *, double *, int, int, ' \
|
|
@@ -115,6 +117,7 @@ module GR
|
|
|
115
117
|
try_extern 'void gr_setcolormap(int)'
|
|
116
118
|
try_extern 'void gr_inqcolormap(int *)'
|
|
117
119
|
try_extern 'void gr_setcolormapfromrgb(int n, double *r, double *g, double *b, double *x)'
|
|
120
|
+
try_extern 'void gr_inqcolormapinds(int *, int *)'
|
|
118
121
|
try_extern 'void gr_colorbar(void)'
|
|
119
122
|
try_extern 'void gr_inqcolor(int, int *)'
|
|
120
123
|
try_extern 'int gr_inqcolorfromrgb(double, double, double)'
|
|
@@ -182,6 +185,8 @@ module GR
|
|
|
182
185
|
try_extern 'void gr_inqborderwidth(double *)'
|
|
183
186
|
try_extern 'void gr_setbordercolorind(int)'
|
|
184
187
|
try_extern 'void gr_inqbordercolorind(int *)'
|
|
188
|
+
try_extern 'void gr_selectclipxform(int)'
|
|
189
|
+
try_extern 'void gr_inqclipxform(int *);'
|
|
185
190
|
try_extern 'void gr_setprojectiontype(int)'
|
|
186
191
|
try_extern 'void gr_inqprojectiontype(int *)'
|
|
187
192
|
try_extern 'void gr_setperspectiveprojection(double, double, double)'
|
|
@@ -202,6 +207,15 @@ module GR
|
|
|
202
207
|
try_extern 'void gr_inqtext3d(double, double, double, char *, int axis, double *, double *)'
|
|
203
208
|
try_extern 'void gr_settextencoding(int)'
|
|
204
209
|
try_extern 'void gr_inqtextencoding(int *)'
|
|
210
|
+
try_extern 'void gr_loadfont(char *, int *)'
|
|
205
211
|
# gr_setcallback(char *(*)(const char *));
|
|
212
|
+
try_extern 'void gr_setthreadnumber(int)'
|
|
213
|
+
try_extern 'void gr_setpicturesizeforvolume(int, int)'
|
|
214
|
+
try_extern 'void gr_setvolumebordercalculation(int)'
|
|
215
|
+
try_extern 'void gr_setapproximativecalculation(int)'
|
|
216
|
+
try_extern 'void gr_inqvolumeflags(int *, int *, int *, int *, int *)'
|
|
217
|
+
try_extern 'void gr_cpubasedvolume(int, int, int, double *, int, double *, double *, double *, double *)'
|
|
218
|
+
try_extern 'void gr_inqvpsize(int *, int *, double *)'
|
|
219
|
+
try_extern 'void gr_polygonmesh3d(int, const double *, const double *, const double *, int, const int *, const int *)'
|
|
206
220
|
end
|
|
207
221
|
end
|
data/lib/gr/plot.rb
CHANGED
|
@@ -33,17 +33,17 @@ module GR
|
|
|
33
33
|
# Plot kinds conform to GR.jl
|
|
34
34
|
PLOT_KIND = %i[line step scatter stem hist contour contourf hexbin heatmap
|
|
35
35
|
nonuniformheatmap wireframe surface plot3 scatter3 imshow
|
|
36
|
-
isosurface polar polarhist polarheatmap
|
|
37
|
-
volume].freeze
|
|
36
|
+
isosurface polar polarhist polarheatmap nonuniformpolarheatmap
|
|
37
|
+
trisurf tricont shade volume].freeze
|
|
38
38
|
|
|
39
39
|
# Keyword options conform to GR.jl.
|
|
40
40
|
KW_ARGS = %i[accelerate algorithm alpha ax backgroundcolor barwidth baseline
|
|
41
41
|
clabels clear clim color colormap crange figsize font grid
|
|
42
|
-
horizontal isovalue kind label labels levels location
|
|
43
|
-
ratio rotation scale size spec subplot tilt title update
|
|
44
|
-
xflip xform xlabel xlim xlog xrange xticks yaxis yflip
|
|
45
|
-
ylim ylog zflip yrange yticks viewport vp where window
|
|
46
|
-
zlabel zlim zlog zrange zticks].freeze
|
|
42
|
+
horizontal isovalue kind label labels levels linewidth location
|
|
43
|
+
nbins ratio rotation scale size spec subplot tilt title update
|
|
44
|
+
xaxis xflip xform xlabel xlim xlog xrange xticks yaxis yflip
|
|
45
|
+
ylabel ylim ylog zflip yrange yticks viewport vp where window
|
|
46
|
+
zaxis zlabel zlim zlog zrange zticks].freeze
|
|
47
47
|
|
|
48
48
|
FONTS = {
|
|
49
49
|
times_roman: 101,
|
|
@@ -78,8 +78,7 @@ module GR
|
|
|
78
78
|
zapfchancery_mediumitalic: 130,
|
|
79
79
|
zapfdingbats: 131,
|
|
80
80
|
cmuserif_math: 232, # original: cmuserif-math
|
|
81
|
-
dejavusans: 233
|
|
82
|
-
pingfangsc: 234
|
|
81
|
+
dejavusans: 233
|
|
83
82
|
}.freeze
|
|
84
83
|
|
|
85
84
|
@last_plot = nil
|
|
@@ -90,7 +89,8 @@ module GR
|
|
|
90
89
|
attr_accessor :args, :kvs, :scheme
|
|
91
90
|
|
|
92
91
|
def initialize(*raw_args)
|
|
93
|
-
|
|
92
|
+
# Keywords are cloned to avoid disruptive changes
|
|
93
|
+
@kvs = raw_args.last.is_a?(Hash) ? raw_args.pop.clone : {}
|
|
94
94
|
@args = plot_args(raw_args) # method name is the same as Julia/Python
|
|
95
95
|
|
|
96
96
|
# Check keyword options.
|
|
@@ -153,15 +153,20 @@ module GR
|
|
|
153
153
|
vp1, vp2, vp3, vp4 = vp
|
|
154
154
|
end
|
|
155
155
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
156
|
+
left_margin = kvs.has_key?(:ylabel) ? 0.05 : 0
|
|
157
|
+
right_margin = if %i[contour contourf hexbin heatmap nonuniformheatmap polarheatmap
|
|
158
|
+
nonuniformpolarheatmap surface trisurf volume].include?(kind)
|
|
159
|
+
(vp2 - vp1) * 0.1
|
|
160
|
+
else
|
|
161
|
+
0
|
|
162
|
+
end
|
|
163
|
+
bottom_margin = kvs.has_key?(:xlabel) ? 0.05 : 0
|
|
164
|
+
top_margin = kvs.has_key?(:title) ? 0.075 : 0
|
|
165
|
+
|
|
166
|
+
viewport = [vp1 + (0.075 + left_margin) * (vp2 - vp1),
|
|
167
|
+
vp1 + (0.95 - right_margin) * (vp2 - vp1),
|
|
168
|
+
vp3 + (0.075 + bottom_margin) * (vp4 - vp3),
|
|
169
|
+
vp3 + (0.975 - top_margin) * (vp4 - vp3)]
|
|
165
170
|
|
|
166
171
|
if %i[line step scatter stem].include?(kind) && kvs[:labels]
|
|
167
172
|
location = kvs[:location] || 1
|
|
@@ -193,7 +198,7 @@ module GR
|
|
|
193
198
|
GR.restorestate
|
|
194
199
|
end
|
|
195
200
|
|
|
196
|
-
if %i[polar polarhist polarheatmap].include? kind
|
|
201
|
+
if %i[polar polarhist polarheatmap nonuniformpolarheatmap].include? kind
|
|
197
202
|
xmin, xmax, ymin, ymax = viewport
|
|
198
203
|
xcenter = 0.5 * (xmin + xmax)
|
|
199
204
|
ycenter = 0.5 * (ymin + ymax)
|
|
@@ -204,7 +209,7 @@ module GR
|
|
|
204
209
|
|
|
205
210
|
def set_window(kind)
|
|
206
211
|
scale = 0
|
|
207
|
-
unless %i[polar polarhist polarheatmap].include?(kind)
|
|
212
|
+
unless %i[polar polarhist polarheatmap nonuniformpolarheatmap].include?(kind)
|
|
208
213
|
scale |= GR::OPTION_X_LOG if kvs[:xlog]
|
|
209
214
|
scale |= GR::OPTION_Y_LOG if kvs[:ylog]
|
|
210
215
|
scale |= GR::OPTION_Z_LOG if kvs[:zlog]
|
|
@@ -219,11 +224,11 @@ module GR
|
|
|
219
224
|
kvs[:xrange] = [xmin, xmax]
|
|
220
225
|
kvs[:yrange] = [ymin, ymax]
|
|
221
226
|
else
|
|
222
|
-
minmax
|
|
227
|
+
minmax(kind)
|
|
223
228
|
end
|
|
224
229
|
|
|
225
230
|
major_count = if %i[wireframe surface plot3 scatter3 polar polarhist
|
|
226
|
-
polarheatmap trisurf volume].include?(kind)
|
|
231
|
+
polarheatmap nonuniformpolarheatmap trisurf volume].include?(kind)
|
|
227
232
|
2
|
|
228
233
|
else
|
|
229
234
|
5
|
|
@@ -239,15 +244,15 @@ module GR
|
|
|
239
244
|
xmax += 0.5
|
|
240
245
|
end
|
|
241
246
|
xtick, majorx = if (scale & GR::OPTION_X_LOG) == 0
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
247
|
+
if !%i[heatmap polarheatmap].include?(kind) &&
|
|
248
|
+
!kvs.has_key?(:xlim) &&
|
|
249
|
+
!kvs[:panzoom]
|
|
250
|
+
xmin, xmax = GR.adjustlimits(xmin, xmax)
|
|
246
251
|
end
|
|
247
252
|
if kvs.has_key?(:xticks)
|
|
248
253
|
kvs[:xticks]
|
|
249
254
|
else
|
|
250
|
-
[
|
|
255
|
+
[auto_tick(xmin, xmax) / major_count, major_count]
|
|
251
256
|
end
|
|
252
257
|
else
|
|
253
258
|
[1, 1]
|
|
@@ -268,15 +273,15 @@ module GR
|
|
|
268
273
|
end
|
|
269
274
|
end
|
|
270
275
|
ytick, majory = if (scale & GR::OPTION_Y_LOG) == 0
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
276
|
+
if !%i[heatmap polarheatmap].include?(kind) &&
|
|
277
|
+
!kvs.has_key?(:ylim) &&
|
|
278
|
+
!kvs[:panzoom]
|
|
279
|
+
ymin, ymax = GR.adjustlimits(ymin, ymax)
|
|
275
280
|
end
|
|
276
281
|
if kvs.has_key?(:yticks)
|
|
277
282
|
kvs[:yticks]
|
|
278
283
|
else
|
|
279
|
-
[
|
|
284
|
+
[auto_tick(ymin, ymax) / major_count, major_count]
|
|
280
285
|
end
|
|
281
286
|
else
|
|
282
287
|
[1, 1]
|
|
@@ -291,7 +296,7 @@ module GR
|
|
|
291
296
|
if kvs.has_key?(:zticks)
|
|
292
297
|
kvs[:zticks]
|
|
293
298
|
else
|
|
294
|
-
[
|
|
299
|
+
[auto_tick(zmin, zmax) / major_count, major_count]
|
|
295
300
|
end
|
|
296
301
|
else
|
|
297
302
|
[1, 1]
|
|
@@ -301,15 +306,16 @@ module GR
|
|
|
301
306
|
end
|
|
302
307
|
|
|
303
308
|
kvs[:window] = xmin, xmax, ymin, ymax
|
|
304
|
-
if %i[polar polarhist polarheatmap].include?(kind)
|
|
309
|
+
if %i[polar polarhist polarheatmap nonuniformpolarheatmap trisurf].include?(kind)
|
|
305
310
|
GR.setwindow(-1, 1, -1, 1)
|
|
306
311
|
else
|
|
307
312
|
GR.setwindow(xmin, xmax, ymin, ymax)
|
|
308
313
|
end
|
|
309
314
|
if %i[wireframe surface plot3 scatter3 trisurf volume].include?(kind)
|
|
310
315
|
rotation = kvs[:rotation] || 40
|
|
311
|
-
tilt = kvs[:tilt] ||
|
|
312
|
-
GR.
|
|
316
|
+
tilt = kvs[:tilt] || 60
|
|
317
|
+
GR.setwindow3d(xmin, xmax, ymin, ymax, zmin, zmax)
|
|
318
|
+
GR.setspace3d(-rotation, tilt, 30, 0)
|
|
313
319
|
end
|
|
314
320
|
|
|
315
321
|
kvs[:scale] = scale
|
|
@@ -319,7 +325,7 @@ module GR
|
|
|
319
325
|
def draw_axes(kind, pass = 1)
|
|
320
326
|
viewport = kvs[:viewport]
|
|
321
327
|
vp = kvs[:vp]
|
|
322
|
-
|
|
328
|
+
_ratio = kvs[:ratio]
|
|
323
329
|
xtick, xorg, majorx = kvs[:xaxis]
|
|
324
330
|
ytick, yorg, majory = kvs[:yaxis]
|
|
325
331
|
drawgrid = kvs.has_key?(:grid) ? kvs[:grid] : true
|
|
@@ -328,10 +334,10 @@ module GR
|
|
|
328
334
|
GR.setlinecolorind(1)
|
|
329
335
|
diag = Math.sqrt((viewport[1] - viewport[0])**2 + (viewport[3] - viewport[2])**2)
|
|
330
336
|
GR.setlinewidth(1)
|
|
331
|
-
charheight = [0.018 * diag, 0.012].max
|
|
332
|
-
GR.setcharheight(charheight)
|
|
333
337
|
ticksize = 0.0075 * diag
|
|
334
338
|
if %i[wireframe surface plot3 scatter3 trisurf volume].include?(kind)
|
|
339
|
+
charheight = [0.024 * diag, 0.012].max
|
|
340
|
+
GR.setcharheight(charheight)
|
|
335
341
|
ztick, zorg, majorz = kvs[:zaxis]
|
|
336
342
|
if pass == 1 && drawgrid
|
|
337
343
|
GR.grid3d(xtick, 0, ztick, xorg[0], yorg[1], zorg[0], 2, 0, 2)
|
|
@@ -341,6 +347,8 @@ module GR
|
|
|
341
347
|
GR.axes3d(0, ytick, 0, xorg[1], yorg[0], zorg[0], 0, majory, 0, ticksize)
|
|
342
348
|
end
|
|
343
349
|
else
|
|
350
|
+
charheight = [0.018 * diag, 0.012].max
|
|
351
|
+
GR.setcharheight(charheight)
|
|
344
352
|
if %i[heatmap nonuniformheatmap shade].include?(kind)
|
|
345
353
|
ticksize = -ticksize
|
|
346
354
|
elsif drawgrid
|
|
@@ -423,7 +431,7 @@ module GR
|
|
|
423
431
|
GR.setcharheight(charheight)
|
|
424
432
|
GR.setlinetype(GR::LINETYPE_SOLID)
|
|
425
433
|
|
|
426
|
-
tick =
|
|
434
|
+
tick = auto_tick(rmin, rmax)
|
|
427
435
|
n = ((rmax - rmin) / tick + 0.5).round
|
|
428
436
|
(n + 1).times do |i|
|
|
429
437
|
r = i.to_f / n
|
|
@@ -585,7 +593,7 @@ module GR
|
|
|
585
593
|
charheight = [0.016 * diag, 0.012].max
|
|
586
594
|
GR.setcharheight(charheight)
|
|
587
595
|
if kvs[:scale] & GR::OPTION_Z_LOG == 0
|
|
588
|
-
ztick =
|
|
596
|
+
ztick = auto_tick(zmin, zmax)
|
|
589
597
|
GR.axes(0, ztick, 1, zmin, 0, 1, 0.005)
|
|
590
598
|
else
|
|
591
599
|
GR.setscale(GR::OPTION_Y_LOG)
|
|
@@ -617,12 +625,17 @@ module GR
|
|
|
617
625
|
if kvs.has_key?(:font)
|
|
618
626
|
name = kvs[:font]
|
|
619
627
|
# 'Cmuserif-Math' => :cmuserif_math
|
|
620
|
-
sym_name = name.to_s.gsub('-','_').downcase.to_sym
|
|
628
|
+
sym_name = name.to_s.gsub('-', '_').downcase.to_sym
|
|
621
629
|
if FONTS.include?(sym_name)
|
|
622
630
|
font = FONTS[sym_name]
|
|
623
631
|
GR.settextfontprec(font, font > 200 ? 3 : 0)
|
|
624
632
|
else
|
|
625
|
-
|
|
633
|
+
font = GR.loadfont(name)
|
|
634
|
+
if font >= 0
|
|
635
|
+
GR.settextfontprec(font, 3)
|
|
636
|
+
else
|
|
637
|
+
warn "Unknown font name: #{name}"
|
|
638
|
+
end
|
|
626
639
|
end
|
|
627
640
|
else
|
|
628
641
|
# The following fonts are the default in GR.jl
|
|
@@ -636,7 +649,7 @@ module GR
|
|
|
636
649
|
set_window(kind)
|
|
637
650
|
if %i[polar polarhist].include?(kind)
|
|
638
651
|
draw_polar_axes
|
|
639
|
-
elsif !%i[imshow isosurface polarheatmap].include?(kind)
|
|
652
|
+
elsif !%i[imshow isosurface polarheatmap nonuniformpolarheatmap].include?(kind)
|
|
640
653
|
draw_axes(kind)
|
|
641
654
|
end
|
|
642
655
|
end
|
|
@@ -657,8 +670,12 @@ module GR
|
|
|
657
670
|
|
|
658
671
|
when :line
|
|
659
672
|
mask = GR.uselinespec(spec)
|
|
660
|
-
|
|
661
|
-
|
|
673
|
+
linewidth = kvs[:linewidth]
|
|
674
|
+
# Slightly different from Julia,
|
|
675
|
+
# Because the implementation of polyline and polymarker is different.
|
|
676
|
+
z ||= linewidth # FIXME
|
|
677
|
+
GR.polyline(x, y, z, c) if hasline(mask)
|
|
678
|
+
GR.polymarker(x, y, z, c) if hasmarker(mask)
|
|
662
679
|
|
|
663
680
|
when :step
|
|
664
681
|
mask = GR.uselinespec(spec)
|
|
@@ -694,20 +711,9 @@ module GR
|
|
|
694
711
|
|
|
695
712
|
when :scatter
|
|
696
713
|
GR.setmarkertype(GR::MARKERTYPE_SOLID_CIRCLE)
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
c = c.map { |i| normalize_color(i, cmin, cmax) }
|
|
701
|
-
cind = c.map { |i| (1000 + i * 255).round }
|
|
702
|
-
end
|
|
703
|
-
x.length.times do |i|
|
|
704
|
-
GR.setmarkersize(z[i] / 100.0) if z
|
|
705
|
-
GR.setmarkercolorind(cind[i]) if c
|
|
706
|
-
GR.polymarker([x[i]], [y[i]])
|
|
707
|
-
end
|
|
708
|
-
else
|
|
709
|
-
GR.polymarker(x, y)
|
|
710
|
-
end
|
|
714
|
+
z = z&.map { |i| i * 0.01 }
|
|
715
|
+
c = c&.map { |i| normalize_color(i, *kvs[:crange]) }
|
|
716
|
+
GR.polymarker(x, y, z, c)
|
|
711
717
|
|
|
712
718
|
when :stem
|
|
713
719
|
GR.setlinecolorind(1)
|
|
@@ -757,7 +763,7 @@ module GR
|
|
|
757
763
|
GR.fillarc(-ρ[i], ρ[i], -ρ[i], ρ[i], θ[i - 1], θ[i])
|
|
758
764
|
end
|
|
759
765
|
|
|
760
|
-
when :polarheatmap
|
|
766
|
+
when :polarheatmap, :nonuniformpolarheatmap
|
|
761
767
|
w, h = z.shape
|
|
762
768
|
cmap = colormap
|
|
763
769
|
cmin, cmax = kvs[:zrange]
|
|
@@ -766,7 +772,15 @@ module GR
|
|
|
766
772
|
data.reverse(axis: 1) if kvs[:yflip]
|
|
767
773
|
colors = data * 255 + 1000
|
|
768
774
|
colors = colors.transpose # Julia is column major
|
|
769
|
-
|
|
775
|
+
case kind
|
|
776
|
+
when :polarheatmap
|
|
777
|
+
GR.polarcellarray(0, 0, 0, 360, 0, 1, w, h, colors)
|
|
778
|
+
when :nonuniformpolarheatmap
|
|
779
|
+
ymax = y.max.to_f
|
|
780
|
+
ρ = y.map { |i| i / ymax }
|
|
781
|
+
θ = x.map { |i| i * 180 / Math::PI }
|
|
782
|
+
GR.nonuniformpolarcellarray(θ, ρ, w, h, colors)
|
|
783
|
+
end
|
|
770
784
|
draw_polar_axes
|
|
771
785
|
kvs[:zrange] = [cmin, cmax]
|
|
772
786
|
colorbar
|
|
@@ -788,7 +802,7 @@ module GR
|
|
|
788
802
|
zmin = kvs[:zlim].first if kvs[:zlim].first
|
|
789
803
|
zmax = kvs[:zlim].last if kvs[:zlim].last
|
|
790
804
|
end
|
|
791
|
-
|
|
805
|
+
GR.setprojectiontype(0)
|
|
792
806
|
GR.setspace(zmin, zmax, 0, 90)
|
|
793
807
|
levels = kvs[:levels] || 0
|
|
794
808
|
clabels = kvs[:clabels] || false
|
|
@@ -1023,7 +1037,7 @@ module GR
|
|
|
1023
1037
|
|
|
1024
1038
|
def to_svg
|
|
1025
1039
|
## Need IRuby improvemend.
|
|
1026
|
-
GR.show(false) if ENV['
|
|
1040
|
+
GR.show(false) if ENV['GKS_WSTYPE'] == 'svg'
|
|
1027
1041
|
end
|
|
1028
1042
|
|
|
1029
1043
|
private
|
|
@@ -1096,8 +1110,8 @@ module GR
|
|
|
1096
1110
|
|
|
1097
1111
|
# Normalize a color c with the range [cmin, cmax]
|
|
1098
1112
|
# 0 <= normalize_color(c, cmin, cmax) <= 1
|
|
1099
|
-
# Note: narray.map{|i| normalize_color(i)} There's room for speedup.
|
|
1100
1113
|
def normalize_color(c, cmin, cmax)
|
|
1114
|
+
# NOTE: narray.map{|i| normalize_color(i)} There's room for speedup.
|
|
1101
1115
|
c = c.to_f # if c is Integer
|
|
1102
1116
|
c = c.clamp(cmin, cmax) - cmin
|
|
1103
1117
|
c /= (cmax - cmin) if cmin != cmax
|
|
@@ -1134,7 +1148,7 @@ module GR
|
|
|
1134
1148
|
[a, b]
|
|
1135
1149
|
end
|
|
1136
1150
|
|
|
1137
|
-
def minmax
|
|
1151
|
+
def minmax(kind)
|
|
1138
1152
|
xmin = ymin = zmin = cmin = Float::INFINITY
|
|
1139
1153
|
xmax = ymax = zmax = cmax = -Float::INFINITY
|
|
1140
1154
|
scale = kvs[:scale]
|
|
@@ -1147,6 +1161,9 @@ module GR
|
|
|
1147
1161
|
x0, x1 = x.minmax
|
|
1148
1162
|
xmin = [x0, xmin].min
|
|
1149
1163
|
xmax = [x1, xmax].max
|
|
1164
|
+
elsif kind == :volume
|
|
1165
|
+
xmin = -1
|
|
1166
|
+
xmax = 1
|
|
1150
1167
|
else
|
|
1151
1168
|
xmin = 0
|
|
1152
1169
|
xmax = 1
|
|
@@ -1158,6 +1175,9 @@ module GR
|
|
|
1158
1175
|
y0, y1 = y.minmax
|
|
1159
1176
|
ymin = [y0, ymin].min
|
|
1160
1177
|
ymax = [y1, ymax].max
|
|
1178
|
+
elsif kind == :volume
|
|
1179
|
+
ymin = -1
|
|
1180
|
+
ymax = 1
|
|
1161
1181
|
else
|
|
1162
1182
|
ymin = 0
|
|
1163
1183
|
ymax = 1
|
|
@@ -1199,6 +1219,21 @@ module GR
|
|
|
1199
1219
|
end
|
|
1200
1220
|
end
|
|
1201
1221
|
|
|
1222
|
+
def to_wc(wn)
|
|
1223
|
+
xmin, ymin = GR.ndctowc(wn[0], wn[2])
|
|
1224
|
+
xmax, ymax = GR.ndctowc(wn[1], wn[3])
|
|
1225
|
+
[xmin, xmax, ymin, ymax]
|
|
1226
|
+
end
|
|
1227
|
+
|
|
1228
|
+
def auto_tick(amin, amax)
|
|
1229
|
+
scale = 10.0**Math.log10(amax - amin).truncate
|
|
1230
|
+
tick_size = [5.0, 2.0, 1.0, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01]
|
|
1231
|
+
i = tick_size.find_index do |tsize|
|
|
1232
|
+
((amax - amin) / scale / tsize) > 7 # maximum number of tick marks
|
|
1233
|
+
end
|
|
1234
|
+
tick_size[i - 1] * scale
|
|
1235
|
+
end
|
|
1236
|
+
|
|
1202
1237
|
def legend_size
|
|
1203
1238
|
scale = GR.inqscale
|
|
1204
1239
|
GR.selntran(0)
|
|
@@ -1285,6 +1320,20 @@ module GR
|
|
|
1285
1320
|
end
|
|
1286
1321
|
end
|
|
1287
1322
|
|
|
1323
|
+
# (Plot) Draw a nonuniformpolarheatmap.
|
|
1324
|
+
def nonuniformpolarheatmap(*args)
|
|
1325
|
+
# FIXME
|
|
1326
|
+
args, kv = format_xyzc(*args)
|
|
1327
|
+
_x, _y, z = args
|
|
1328
|
+
ysize, xsize = z.shape
|
|
1329
|
+
z = z.reshape(xsize, ysize)
|
|
1330
|
+
create_plot(:nonuniformpolarheatmap, kv) do |plt|
|
|
1331
|
+
plt.kvs[:xlim] ||= [0.5, xsize + 0.5]
|
|
1332
|
+
plt.kvs[:ylim] ||= [0.5, ysize + 0.5]
|
|
1333
|
+
plt.args = [[(1..xsize).to_a, (1..ysize).to_a, z, nil, '']]
|
|
1334
|
+
end
|
|
1335
|
+
end
|
|
1336
|
+
|
|
1288
1337
|
alias _contour_ contour
|
|
1289
1338
|
# (Plot) Draw a contour plot.
|
|
1290
1339
|
def contour(*args)
|