水俣漁業減収1950〜1956
データ表の視覚化で何を気づくかな?「 一本釣漁業」と「囲刺網漁業」はなぜ増えたのかな? カニも54年に増えたみたい(fn:2)。それは生態系の理由か経済的な理由か? カニの天敵が減たやろうか、悪影響が出るまで餌が増えたか、 それか、 遠いところから人がカニを水俣に持って来ただろうか?
元の表は原田正純「水俣病」(岩波新書)12ページにあった。
DrRacket(fn:1)で数値の見える化してみました。
code
#lang racket
(define my-home (find-system-path 'home-dir))
(define learning-directory "Learning-Minamata")
;; 単位 貫 カン 3.75kg 8.3lb
(define data-file "HM-1-p12-FisheryFigures.csv")
;; 種別\年度,昭和25〜28年平均,29年,30年,31年
;; 延縄漁業,1850,1650,1197,540
;; 大網漁業,8350,1535,2003,1936
;; 打瀬網漁業,4380,1612,1131,720
;; 双手巾着網漁業,20460,1316,2589,3101
;; 地曳網漁業,46800,30194,13154,6719
;; 磯刺網漁業,5360,4861,2926,1713
;; 囲刺網漁業,670,657,858,829
;; ボラ飼付籠漁業,5170,5019,2551,1278
;; イカ籠漁業,2500,2324,1344,957
;; ボラ飼付釣漁業,9310,9121,6339,2176
;; 一本釣漁業,6475,8208,6154,3327
;; タコ壺漁業,3650,1444,1625,1125
;; その他の漁業,7485,6576,4077,1072
(define data-path (build-path my-home learning-directory data-file))
(define get-path
(lambda (file-name)
(build-path (current-directory-for-user) file-name)))
(define get-data
(lambda (pth)
(let* ((inp (open-input-file pth))
(lines (port->lines inp)))
(close-input-port inp)
(map (lambda (s) (string-split
(regexp-replace* "\"" s "")
","))
lines))))
(define fishery-data-Nengo (get-data data-path))
;(define headers (first fishery-data))
;; '("魚種" "昭和25〜28年平均" "29年" "30年" "31年")
(define headers-19
'("種別 年度" "1950-53平均" "1954" "1955" "1956"))
#;(define type-en '("long net" "wide net" "trad boat net" "purse seine"
"land haul" " " "squid"
"oyster" "sea slug" "sea eel" "crab" "other" "total"))
(define (貫string->kg-number str)
(* 3.75 (string->number str)))
(define (貫strings-row->kg-numbers row)
(define head (car row))
(cons head
(map 貫string->kg-number (cdr row))))
(define fishery-data-19-kg
(cons headers-19
(map 貫strings-row->kg-numbers
(cdr fishery-data-Nengo))))
(define (data-table->long-form table)
(let ((long-cells '()))
(define column-headers (cdr (car table)))
(define data-rows (cdr table))
(define (add-cell cell)
(set! long-cells (cons cell long-cells)))
(define (data-row->long-cells row)
(define row-head (car row))
(define numbers (cdr row))
(define (data-cell->long-cell num c-head)
(add-cell (list row-head c-head num)))
(map data-cell->long-cell numbers column-headers))
(map data-row->long-cells (cdr table))
(reverse long-cells)))
(define fishery-type-long-form
(data-table->long-form fishery-data-19-kg))
;;fishery-type-long-form
(define (get-percent-of-first-val table type num)
(define type-cells (filter (lambda (cell) (string=? (first cell) type))
table))
(define type-numbers (map third type-cells))
(define standard (first type-numbers))
(* 100 (/ num standard)))
(require plot/utils)
(define (percent->diff-label num)
(if (= num 100)
""
(string-append
(->plot-label (- (- 100 num)) 0)
"%")))
(define (kg-fig->kg-label num)
(string-append (->plot-label num 0) "kg"))
(require plot)
(define horizontal-line
(lambda (x y #:clr (clr "black")) ;; lne-wdh lne-stl ..etc
(lines (list (vector 0 y) (vector x y)) #:color clr)))
(define labeled-point
(lambda (x y l #:ancr (ancr 'left) #:fnt-sze (fnt-sze 8) #:fnt-clr (fnt-clr "black")#:pnt-sze (pnt-sze 5)
#:pnt-clr (pnt-clr 0) #:lbl-angl (lbl-angl 0) )
(point-label (vector x y) l #:anchor ancr #:size fnt-sze #:color fnt-clr #:point-size pnt-sze
#:point-color pnt-clr #:angle lbl-angl)))
;; single row
(define (plot-a-type table row y)
(define type (first row)) ;; row is type/rowheader colheader number
(define type-label (if (> 3 (string-length type))
type
(substring type 0 3)))
(define number (third row))
(define x-percent (get-percent-of-first-val table type number))
(define kglabel (kg-fig->kg-label number))
(define type-kglabel (string-append type-label " " kglabel))
(define %label (percent->diff-label x-percent))
(list
(points (list (vector x-percent y)) #:sym 'fullcircle)
(points (list (vector 100 y)) #:sym 'fullcircle #:size 2 #:color "red")
(labeled-point 0 y type-kglabel #:ancr 'bottom-left #:pnt-sze 0 #:fnt-sze 9 #:fnt-clr "gray")
(horizontal-line x-percent y)
(labeled-point 100 y %label #:ancr 'bottom-right #:pnt-sze 0 #:fnt-sze 10)
(labeled-point 100 y type #:ancr 'bottom-left #:pnt-sze 0 #:fnt-sze 12)
(lines (list (vector x-percent y) (vector 100 y)) #:color "red")))
;; (plot (plot-a-fish (second (second years-alst)) 2) #:x-max 120)
#;(plot (plot-a-type fishery-type-long-form '("イカ籠漁業" "1955" 5040.0) 2)
#:x-max 120)
;; plot-a-column group (group-by second table)
(define (plot-a-column table rows y-center) ;; group
(define x-label (second (car rows)))
(define y-limit .45)
(define ys (linear-seq
(- y-center y-limit) (+ y-center y-limit)
(length rows)))
(define (helper rows ys plots)
(cond
((empty? rows) (reverse plots))
(#t (helper (cdr rows) (cdr ys)
(cons (plot-a-type table (car rows) (car ys)) plots)))))
(list (labeled-point 0 (+ y-center y-limit) x-label #:fnt-sze 14 #:pnt-sze 0 #:ancr 'right #:lbl-angl (/ pi 4))
(helper rows (reverse ys) '())))
(define (plot-columns table)
(define columns (group-by second table))
(define len (length (car columns)))
(define y-seq (linear-seq 1 len len))
(define (helper cols ys plots)
(cond
((empty? cols) (reverse plots))
(#t (helper (cdr cols) (cdr ys)
(cons (plot-a-column table (car cols) (car ys))
plots)))))
(helper columns y-seq '()))
(parameterize
((plot-title "原田正純「水俣病」p.12 漁業種類別漁獲高 '53-'56")
(plot-x-axis? #f)
(plot-x-far-axis? #f)
(plot-x-label #f)
(plot-y-axis? #f)
(plot-y-far-axis? #f)
(plot-y-label #f)
(plot-width 600)
(plot-height 1200)
)
(plot (plot-columns fishery-type-long-form)
#:x-min -22 #:x-max 130
#:y-min .5 #:y-max 4.5
#:out-file "p12-plot-columns-5.png"
#:out-kind 'png))
(define (plot-a-type-row table row y)
(define type (car row))
(define type-label (if (> 4 (string-length type))
type
(substring type 0 3)))
(define col-label (second row))
(define number (third row))
(define x-percent (get-percent-of-first-val table type number))
(define kglabel (kg-fig->kg-label number))
(define type-kglabel (string-append type-label " " kglabel))
(define %label (percent->diff-label x-percent))
(define %-col (string-append %label " " col-label))
(list
(points (list (vector x-percent y)) #:sym 'fullcircle)
(points (list (vector 100 y)) #:sym 'fullcircle #:size 2 #:color "red")
;(labeled-point 0 y col-label #:ancr 'bottom-left #:pnt-sze 0 #:fnt-clr "gray")
(labeled-point 100 y kglabel #:ancr 'bottom-right #:pnt-sze 0 #:fnt-sze 9 #:fnt-clr "darkgray")
(horizontal-line x-percent y)
(labeled-point 100 y %-col #:ancr 'bottom-left #:pnt-sze 0 #:fnt-sze 10)
;; (labeled-point 100 y type-label #:ancr 'bottom-left #:pnt-sze 0 #:fnt-sze 12)
(lines (list (vector x-percent y) (vector 100 y)) #:color "red")))
(define (plot-rows-of-type table rows y-center)
(define y-label (first (car rows)))
(define y-limit .35)
(define ys (linear-seq (- y-center y-limit) (+ y-center y-limit)
(length rows)))
(define (helper rows ys plots)
(cond
((empty? rows)(reverse plots))
(#t (helper (cdr rows)(cdr ys)
(cons (plot-a-type-row table (car rows) (car ys))
plots))))) ; #:lbl-angl (/ pi 4)
(list (labeled-point 120 y-center y-label #:fnt-sze 12 #:pnt-sze 0 #:ancr 'left)
;(horizontal-line (- 30) (- y-center .5) #:clr "gray")
(helper rows ys '())))
;; row-headers
(define (plot-types long-form-table)
(define type-groups (group-by first long-form-table))
(define y-range (length type-groups))
(define y-sequence (linear-seq 1 y-range y-range))
(define (helper groups ys plots)
(cond
((empty? groups) plots) ;; no need reverse, y-seq determines placement
(#t (helper (cdr groups)(cdr ys)
(cons (plot-rows-of-type
long-form-table
(car groups)
(car ys))
plots)))))
;; keep top of table at tope of plot by reversing ys
(helper type-groups (reverse y-sequence) '()))
(parameterize
((plot-title "原田正純「水俣病」p.12 漁業種類別漁獲高 '53-'56")
(plot-x-axis? #f)
(plot-x-far-axis? #f)
(plot-x-label #f)
(plot-y-axis? #f)
(plot-y-far-axis? #f)
(plot-y-label #f)
(plot-width 600)
(plot-height 1200)
)
(plot
(plot-types fishery-type-long-form)
#:x-min -15 #:x-max 160
#:y-min .5 #:y-max (+ .5 (length (group-by first fishery-type-long-form)))
#:out-file "p12-long-form-columns-5.png"
#:out-kind 'png
))
- (fn:1) 使用方法: http://stdio.h.kyoto-u.ac.jp/~sakura/scheme/racket/Racket.html
- (fn:2) https://write.as/bs2lr/racket-plot-minamata-fishery-decline-1950s
#DrRacket #DataVisualization #Minamata #HaradaMasazumi #MasazumiHarada #水俣病 #原田正純 #データビジュアリゼーション #漁業