水俣漁業減収1950〜1956

データ表の視覚化で何を気づくかな?「 一本釣漁業」と「囲刺網漁業」はなぜ増えたのかな? カニも54年に増えたみたい(fn:2)。それは生態系の理由か経済的な理由か? カニの天敵が減たやろうか、悪影響が出るまで餌が増えたか、 それか、 遠いところから人がカニを水俣に持って来ただろうか?

元の表は原田正純「水俣病」(岩波新書)12ページにあった。

漁業種類別漁獲高データ表本ver.

DrRacket(fn:1)で数値の見える化してみました。 原田「水俣病」p12視覚化スクリーンショット

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
      ))

#DrRacket #DataVisualization #Minamata #HaradaMasazumi #MasazumiHarada #水俣病 #原田正純 #データビジュアリゼーション #漁業