Skip to content

Commit 4b62efe

Browse files
committed
Add rudimentary display to show axis information
Update README with new display
1 parent 80e04fd commit 4b62efe

File tree

3 files changed

+95
-79
lines changed

3 files changed

+95
-79
lines changed

README.md

Lines changed: 79 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -31,28 +31,23 @@ julia> fs = 40000 # Generate a 40kHz noisy signal, with spike-like stuff added f
3131
end
3232

3333
julia> A = AxisArray([y 2y], Axis{:time}(0s:1s/fs:60s), Axis{:chan}([:c1, :c2]))
34-
2400001x2 AxisArrays.AxisArray{Float64,2,Array{Float64,2},Tuple{AxisArrays.Axis{:time,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}},AxisArrays.Axis{:chan,Array{Symbol,1}}}}:
35-
-0.987931 -1.97586
36-
-0.719792 -1.43958
37-
-0.4038 -0.8076
38-
-1.12146 -2.24293
39-
3.31236 6.62473
40-
-2.38934 -4.77868
41-
-3.65712 -7.31424
42-
-1.57186 -3.14373
43-
-3.89403 -7.78806
44-
-3.48901 -6.97803
34+
2-dimensional AxisArray{Float64,2,...} with axes:
35+
:time, 0.0 s:2.5e-5 s:60.0 s
36+
:chan, [:c1,:c2]
37+
And data, a 2400001x2 Array{Float64,2}:
38+
-3.06091 -6.12181
39+
0.152334 0.304668
40+
7.86831 15.7366
41+
-1.4144 -2.82879
42+
-2.02881 -4.05763
43+
9.87901 19.758
4544
46-
1.16204 2.32408
47-
0.105888 0.211777
48-
-4.5175 -9.03501
49-
-0.792749 -1.5855
50-
1.99229 3.98458
51-
1.44092 2.88184
52-
-1.06677 -2.13353
53-
3.03809 6.07619
54-
-2.90052 -5.80104
55-
-0.519704 -1.03941
45+
-0.0254444 -0.0508888
46+
0.204358 0.408717
47+
-4.80093 -9.60186
48+
5.39751 10.795
49+
0.976276 1.95255
50+
0.336558 0.673116
5651
```
5752

5853
AxisArrays behave like regular arrays, but they additionally use the axis
@@ -61,16 +56,21 @@ indices in *any* order, just so long as we annotate them with the axis name:
6156

6257
```jl
6358
julia> A[Axis{:time}(4)]
64-
1x2 AxisArrays.AxisArray{Float64,2,SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},Colon},2},Tuple{AxisArrays.Axis{:time,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}},AxisArrays.Axis{:chan,Array{Symbol,1}}}}:
65-
-1.12146 -2.24293
59+
2-dimensional AxisArray{Float64,2,...} with axes:
60+
:time, 7.5e-5 s:2.5e-5 s:7.5e-5 s
61+
:chan, [:c1,:c2]
62+
And data, a 1x2 SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},Colon},2}:
63+
-1.4144 -2.82879
6664

6765
julia> A[Axis{:chan}(:c2), Axis{:time}(1:5)]
68-
5-element AxisArrays.AxisArray{Float64,1,SubArray{Float64,1,Array{Float64,2},Tuple{UnitRange{Int64},Int64},2},Tuple{AxisArrays.Axis{:time,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}}}}:
69-
-1.97586
70-
-1.43958
71-
-0.8076
72-
-2.24293
73-
6.62473
66+
1-dimensional AxisArray{Float64,1,...} with axes:
67+
:time, 0.0 s:2.5e-5 s:0.0001 s
68+
And data, a 5-element SubArray{Float64,1,Array{Float64,2},Tuple{UnitRange{Int64},Int64},2}:
69+
-6.12181
70+
0.304668
71+
15.7366
72+
-2.82879
73+
-4.05763
7474
```
7575

7676
We can also index by the *values* of each axis using an `Interval` type that
@@ -80,17 +80,19 @@ still has the correct time information for those datapoints!
8080

8181
```jl
8282
julia> A[40µs .. 220µs, :c1]
83-
7-element AxisArrays.AxisArray{Float64,1,SubArray{Float64,1,Array{Float64,2},Tuple{UnitRange{Int64},Int64},2},Tuple{AxisArrays.Axis{:time,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}}}}:
84-
-0.4038
85-
-1.12146
86-
3.31236
87-
-2.38934
88-
-3.65712
89-
-1.57186
90-
-3.89403
83+
1-dimensional AxisArray{Float64,1,...} with axes:
84+
:time, 5.0e-5 s:2.5e-5 s:0.0002 s
85+
And data, a 7-element SubArray{Float64,1,Array{Float64,2},Tuple{UnitRange{Int64},Int64},2}:
86+
7.86831
87+
-1.4144
88+
-2.02881
89+
9.87901
90+
0.463201
91+
2.49211
92+
-1.97716
9193

9294
julia> axes(ans, 1)
93-
AxisArrays.Axis{:time,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}}(5.0e-5 s:2.5e-5 s:0.00015 s)
95+
AxisArrays.Axis{:time,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}}(5.0e-5 s:2.5e-5 s:0.0002 s)
9496
```
9597

9698
Sometimes, though, what we're really interested in is a window of time about a
@@ -101,14 +103,16 @@ we use the `atindex` function:
101103

102104
```jl
103105
julia> A[atindex(-90µs .. 90µs, 5), :c2]
104-
7-element AxisArrays.AxisArray{Float64,1,SubArray{Float64,1,Array{Float64,2},Tuple{UnitRange{Int64},Int64},2},Tuple{AxisArrays.Axis{:time,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}}}}:
105-
-1.43958
106-
-0.8076
107-
-2.24293
108-
6.62473
109-
-4.77868
110-
-7.31424
111-
-3.14373
106+
1-dimensional AxisArray{Float64,1,...} with axes:
107+
:time, SIUnits.SIQuantity{Float64,0,0,1,0,0,0,0,0,0}[5.0e-5 s,7.5e-5 s,0.0001 s,0.000125 s,0.00015 s,0.000175 s,0.0002 s]
108+
And data, a 7-element SubArray{Float64,1,Array{Float64,2},Tuple{AxisArrays.AxisArray{Int64,1,UnitRange{Int64},Tuple{AxisArrays.Axis{:sub,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}}}},Int64},0}:
109+
15.7366
110+
-2.82879
111+
-4.05763
112+
19.758
113+
0.926402
114+
4.98423
115+
-3.95433
112116
```
113117

114118
This simple concept can be extended to some very powerful behaviors. For
@@ -117,31 +121,26 @@ crossings.
117121

118122
```jl
119123
julia> idxs = find(diff(A[:,:c1] .< -15) .> 0)
120-
248-element Array{Int64,1}: ...
124+
242-element Array{Int64,1}: ...
121125

122126
julia> spks = A[atindex(-200µs .. 800µs, idxs), :c1]
123-
39x248 AxisArrays.AxisArray{Float64,2,Array{Float64,2},Tuple{AxisArrays.Axis{:time_sub,SIUnits.SIRange{FloatRange{Float64},Float64,0,0,1,0,0,0,0,0,0}},AxisArrays.Axis{:time_rep,Array{SIUnits.SIQuantity{Float64,0,0,1,0,0,0,0,0,0},1}}}}:
124-
3.76269 3.20058 6.30581 9.6313 9.05193 0.214391
125-
1.63657 3.26572 5.48104 1.4864 1.44608 6.1742
126-
2.18868 5.87366 1.254 0.191431 1.69441 0.998004
127-
3.8641 0.626106 0.147373 -1.66639 -2.91957 6.63631
128-
-3.89523 -2.43706 2.54553 1.7135 -2.62467 -3.57186
129-
-6.34036 -0.208273 2.06302 -5.43846 -5.53668 -6.3077
130-
-14.6912 -3.3506 -7.20661 -9.52052 -7.66351 -10.9802
131-
-26.3792 -16.0027 -20.6367 -16.4083 -17.2507 -23.289
132-
-31.6724 -25.7845 -19.683 -21.5722 -26.4421 -27.0657
133-
-40.0827 -29.7741 -29.1362 -31.2018 -33.5294 -28.8294
134-
135-
2.65848 4.67792 2.62444 8.10507 0.972752 0.57176
136-
-0.735043 7.30589 2.10037 4.99347 7.31926 -3.97361
137-
1.91337 -4.53805 -3.3277 7.25753 1.24124 1.52025
138-
4.52168 -1.21125 0.763654 -2.29234 -2.35595 -2.28334
139-
1.48209 -0.79957 -6.21036 4.92486 -1.56463 -3.57588
140-
-3.5987 1.98851 1.0221 -4.33494 3.96454 0.522113
141-
-0.109871 3.17695 1.62774 0.998204 0.441668 6.64595
142-
5.56824 0.0631867 2.73849 1.53731 -4.08166 4.67527
143-
-1.43892 -5.00031 1.36733 3.70478 -0.25762 -1.40656
144-
0.76075 3.90081 -4.59973 -2.91403 0.830114 -1.92139
127+
2-dimensional AxisArray{Float64,2,...} with axes:
128+
:time_sub, -0.000175 s:2.5e-5 s:0.000775 s
129+
:time_rep, SIUnits.SIQuantity{Float64,0,0,1,0,0,0,0,0,0}[0.178725 s,0.806825 s,0.88305 s,1.47485 s,1.50465 s,1.53805 s,1.541025 s,2.16365 s,2.368425 s,2.739 s 57.797925 s,57.924075 s,58.06075 s,58.215125 s,58.6403 s,58.96215 s,58.990225 s,59.001325 s,59.48395 s,59.611525 s]
130+
And data, a 39x242 Array{Float64,2}:
131+
-1.53038 4.72882 5.8706 -0.231564 0.624714 3.44076
132+
-2.24961 2.12414 5.69936 7.00179 2.30993 5.20432
133+
5.96311 3.9713 -4.38335 1.32617 -0.686648 0.443454
134+
3.86592 5.7466 2.32469 1.30803 3.44585 1.17781
135+
3.56837 -3.32178 1.16106 -3.91796 2.41779 -6.17495
136+
-9.52063 -2.07014 -1.18463 -3.55719 2.23117 1.76089
137+
138+
3.51708 -1.63627 0.281915 -2.41759 3.39403 0.101004
139+
0.0421772 -2.13557 -4.71965 0.066912 3.25141 -0.445574
140+
3.53238 -3.72221 1.68314 -4.15147 -5.25241 -1.77557
141+
-4.38307 1.38275 -1.33641 3.40342 0.272826 -3.22013
142+
2.54846 -0.0194032 2.58679 -0.000676503 -2.71147 -0.288483
143+
0.260694 -4.1724 -0.111377 3.283 1.77147 -0.367888
145144
```
146145

147146
By indexing with a repeated interval, we have *added* a dimension to the
@@ -158,16 +157,17 @@ julia> using Sparklines
158157
print(t[i], ":\t")
159158
sparkln(spks[:, i])
160159
end
161-
0.37735 s: ▆▆▆▆▅▅▄▃▂▁▁▁▁▁▂▃▄▅▅▆▆▇▇█▇▇▇▇▆▆▅▆▆▆▅▅▆▅▆
162-
0.79485 s: ▆▆▆▆▅▆▅▄▃▃▂▁▁▁▂▂▃▄▄▆▆▆▇▇█▇▇▇▇▆▆▅▆▆▆▆▆▅▆
163-
0.8388 s: ▄▄▄▄▄▄▃▁▁▁▁▁▃▄▆█▆▆▄▃▃▄▃▄▃▄▃▄▄▄▄▃▄▃▄▄▄▄▃
164-
1.05005 s: ▅▆▅▅▆▅▄▄▃▃▂▁▁▁▂▃▃▄▅▅▆▆▇▇▇▇▇█▆▆▆▅▅▆▆▆▅▅▆
165-
1.11805 s: ▄▄▅▄▄▃▂▂▁▁▁▃▄▇█▇▆▅▄▄▄▄▄▄▄▄▄▄▄▃▃▄▄▃▃▄▄▄▄
166-
1.245175 s: ▄▄▅▄▄▃▃▂▂▁▁▁▂▅█▇▆▆▅▄▄▄▄▃▃▄▃▄▄▄▄▃▄▃▄▃▄▄▄
167-
1.245225 s: ▅▄▄▃▃▂▂▁▁▁▂▅█▇▆▆▅▄▄▄▄▃▃▄▃▄▄▄▄▃▄▃▄▃▄▄▄▄▄
168-
1.534675 s: ▆▆▆▆▆▅▅▄▃▂▂▁▁▁▂▂▃▄▄▆▆▇▇▇▇█▇▇▇▆▇▆▆▆▅▆▆▆▆
169-
1.73505 s: ▄▄▅▄▃▃▂▂▁▁▁▃▄▆█▇▆▅▄▄▄▄▅▄▄▄▄▄▄▄▄▄▄▄▃▄▄▄▄
170-
2.3224 s: ▄▄▅▅▄▄▄▂▂▁▁▁▄▅▇▇█▆▅▄▄▄▄▄▄▄▄▄▅▅▄▅▄▄▅▅▄▄▄
160+
d
161+
0.178725 s: ▄▄▅▄▄▃▃▂▁▁▂▃▅▆█▇▇▅▄▄▄▄▄▄▄▄▄▄▄▄▄▄▅▄▄▄▄▄▄
162+
0.806825 s: ▄▄▄▄▃▄▃▂▁▁▁▃▄▇█▇▆▅▄▃▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▃▄▄▃
163+
0.88305 s: ▆▆▅▆▆▅▄▄▃▂▁▁▁▁▂▂▃▄▄▅▇▆▇▇▇▇▇█▆▆▆▆▆▆▅▆▅▆▅
164+
1.47485 s: ▅▆▆▆▅▅▄▃▂▁▁▁▁▁▂▂▄▅▅▇▇▇▇▇▇█▆▇▆▆▆▆▆▆▆▆▆▆▅
165+
1.50465 s: ▄▄▄▄▃▃▂▁▁▁▁▃▄▆█▇▆▅▃▃▃▃▃▄▄▄▄▄▄▄▄▄▃▃▄▄▄▄▄
166+
1.53805 s: ▄▃▄▄▄▃▃▂▁▁▁▂▅▆▇█▆▅▃▄▄▄▄▃▄▄▄▄▃▄▄▄▄▄▄▄▄▄▄
167+
1.541025 s: ▆▆▆▆▆▄▄▄▃▂▂▁▁▁▂▂▃▄▅▅▆▆▇▇▇▇█▆▆▆▆▅▅▅▅▅▅▆▅
168+
2.16365 s: ▄▄▅▄▄▃▂▁▁▁▁▃▅▇█▇▆▅▅▄▄▄▄▄▃▄▄▄▄▄▄▄▄▄▄▄▄▄▃
169+
2.368425 s: ▆▆▆▆▅▅▄▃▂▁▁▁▁▂▂▃▄▅▆▆▇▇▇▇▇▇█▆▆▆▆▆▆▆▆▆▆▆▅
170+
2.739 s: ▆▆▅▆▅▄▅▄▃▃▂▁▁▁▁▂▃▄▅▅▆▇▇▇█▇▇▆▆▆▆▅▆▅▆▅▆▇▅
171171
```
172172

173173
Fancier integration with plotting packages is a WIP.

src/core.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,19 @@ Base.similar{T}(A::AxisArray{T}, S, axs::Axis...) = similar(A, S, axs)
245245
AxisArray(d, $ax)
246246
end
247247
end
248+
# A simple display method to include axis information. It might be nice to
249+
# eventually display the axis labels alongside the data array, but that is
250+
# much more difficult.
251+
function Base.writemime{T,N}(io::IO, m::MIME"text/plain", A::AxisArray{T,N})
252+
println(io, "$N-dimensional AxisArray{$T,$N,...} with axes:")
253+
for (name, val) in zip(axisnames(A), axisvalues(A))
254+
print(io, " :$name, ")
255+
Base.showlimited(io, val)
256+
println(io)
257+
end
258+
print(io, "And data, a ")
259+
writemime(io, m, A.data)
260+
end
248261

249262
# Custom methods specific to AxisArrays
250263
@doc """

test/core.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,6 @@ A = AxisArray(reshape(1:24, 2,3,4),
109109
@test hash(Axis{:row}()) != hash(Axis{:col}())
110110
@test AxisArrays.axistype(Axis{1}(1:2)) == typeof(1:2)
111111
@test axisnames(Axis{1}, Axis{2}, Axis{3}) == (1,2,3)
112+
113+
# Simply run the display method to ensure no stupid errors
114+
writemime(IOBuffer(),MIME("text/plain"),A)

0 commit comments

Comments
 (0)