読者です 読者をやめる 読者になる 読者になる

遊び tokidoki 仕事

数学と音楽と教育と遊び

Top | おしごと | ゼミ | がくせい | すうがく | かがく | きょういく | おんがく | おきにー | Tips | Photo | イベント | ものもう | あれこれ | About

箱ひげ図自動作成マクロ作ったよ

統計教育の必要性が叫ばれ始めて随分と経つそうだ.
そして今年度もやがて始まる講義,統計とコンピュータ用に作ってみた.
講義内容・方法を全面的に変えようと画策しているが,未だ目処が立たず.
ちょっと気が滅入ってきている今日このごろ.
f:id:okiraku894:20150402190751p:plain
五数要約と平均値が書かれていれば,その範囲を選択して【Ctrl+b】をすると
そのシートに箱ひげ図ができあがる,というものだ.
2015/04/27 修正!
項目の方向を自動判定させず常に
横方向が項目となるようにした.
余分な系列が表示されていたので消した.
散布図で平均の位置を描いていたのを変更.
項目が文字だとエラーが出るので訂正した.

あちこちサイトを回ってかき集めた情報で何とか作ったシロモノなので,ソースは汚い.
サーフィンしてみてわかったけど,苦労している人が多そうだから
ここにのっけておく.結構需要高いと思う.
あ,エラー対策してないから,間違った範囲選択でCtrl+bするとマクロ画面に変わります.
20150427_boxplot_macro.xlsm 直

Sub boxplot()
'
' boxplot Macro
'
' 五数要約(上から順に,最大・第3四分位・中央・第1四分位・最小値・平均値)とした表から
' 箱ひげ図を作る
'
' Ver. 2015/04/27
' http://tokidoki.hatenablog.jp/
'
' Keyboard Shortcut: Ctrl+b
'
    Dim box0, dWisker, uWisker, Mean
    
    ActSht = ActiveSheet.Name 'アクティブシート名取得
    Set ActArea = Selection
    ActCell = ActArea.Address '選択範囲のアドレスを取得(項目名,最大~平均値を囲う)
    box0 = Range(ActCell)
    UB = UBound(box0, 2)
    UBB = UBound(box0, 1)
    ReDim boxName(1 To UB)  '(1,i):項目名
    ReDim boxLB(1 To UB) '(2,i):箱の下境界
    ReDim boxMid(1 To UB) '(3,i):中央線まで
    ReDim boxUB(1 To UB) '(4,i):箱の上境界まで
    ReDim dWisker(1 To UB) '(5,i):下ヒゲ長
    ReDim uWisker(1 To UB) '(6,i):上ヒゲ長
    ReDim Mean(1 To UB)  '(7,i):平均値
    
    '五数要約からグラフ表示用のデータに変換
    For i = 1 To UB
        boxName(i) = box0(1, i)
        boxLB(i) = box0(5, i)
        boxMid(i) = box0(4, i) - box0(5, i)
        boxUB(i) = box0(3, i) - box0(4, i)
        dWisker(i) = box0(6, i) - box0(5, i)
        uWisker(i) = box0(2, i) - box0(3, i)
        Mean(i) = box0(7, i)
    Next i
    
    'メインの箱の系列データをセット,グラフをSheet内に配置
    Charts.Add
    With ActiveChart
        .ChartType = xlColumnStacked
        .PlotBy = xlRows
        .SeriesCollection(6).Delete
        .SeriesCollection(5).Delete
        .SeriesCollection(4).Delete
        .SeriesCollection(1).XValues = boxName
        .SeriesCollection(1).Values = boxLB
        .SeriesCollection(2).Values = boxMid
        .SeriesCollection(3).Values = boxUB
        .HasLegend = False
        .Location Where:=xlLocationAsObject, Name:=ActSht
    End With
    
    'メインの箱の色と線を変更
    ActiveChart.SeriesCollection(1).Select
    Selection.Format.Fill.Visible = msoFalse
    ActiveChart.SeriesCollection(2).Select
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.ObjectThemeColor = msoThemeColorAccent5
        .ForeColor.TintAndShade = 0
        .ForeColor.Brightness = 0.6
        .Transparency = 0
        .Solid
    End With
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 0)
        .Transparency = 0
    End With
    ActiveChart.SeriesCollection(3).Select
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.ObjectThemeColor = msoThemeColorAccent5
        .ForeColor.TintAndShade = 0
        .ForeColor.Brightness = 0.6
        .Transparency = 0
        .Solid
    End With
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 0)
        .Transparency = 0
    End With
    
    '上下のひげ.ただし下ヒゲもxlErrorBarIncludePlusValuesで行ったので,
    '使う値dWisker()は負になるよう計算してある.
    With ActiveChart
        .SeriesCollection(3).HasErrorBars = True
        .SeriesCollection(3).ErrorBar Direction:=xlY, Include:= _
            xlPlusValues, Type:=xlErrorBarTypeCustom, amount:=0
        .SeriesCollection(3).ErrorBar Direction:=xlY, Include:= _
            xlErrorBarIncludePlusValues, Type:=xlErrorBarTypeCustom, amount:=uWisker
        .SeriesCollection(1).HasErrorBars = True
        .SeriesCollection(1).ErrorBar Direction:=xlY, Include:= _
            xlErrorBarIncludePlusValues, Type:=xlErrorBarTypeCustom, amount:=dWisker
    End With
    
    '平均値をマーカーのみの折れ線グラフで追加
    With ActiveChart
        .SeriesCollection.NewSeries
        .SeriesCollection(4).Values = Mean
        .SeriesCollection(4).ChartType = xlLineMarkers '折れ線グラフ
        .SeriesCollection(4).Select
    End With
    With ActiveChart.SeriesCollection(4)
        .MarkerStyle = 4 'マーカーは×
        .MarkerSize = 8
        .Format.Fill.Visible = msoFalse 'マーカーを塗りつぶさない
        .Format.Line.Visible = msoFalse '折れ線は消す
        .MarkerForegroundColor = RGB(255, 0, 0) 'マーカーは赤で
    End With
    
    ActiveChart.Axes(xlValue).MajorGridlines.Delete ' 横目盛線消去
End Sub

でろ~ん,と右から出ちゃうあれをなくす方法

もう,ホントにただの自分用覚書.
Windows 8をノートで使っている人は皆同じように悩んでいるであろう,
ついつい右から出ちゃうあれ,「チャーム」を出なくする方法がようやく分かったので.

1. まずコントロールパネル→デスクトップのカスタマイズ→ハードウェアとサウンド
f:id:okiraku894:20141103210224p:plain

2. で,マウス
f:id:okiraku894:20141103210223p:plain

3. の中のデバイス設定
f:id:okiraku894:20141103210222p:plain

4. の設定で
f:id:okiraku894:20141103210221p:plain

5. 「エッジスワイプを使用する」のチェックを外し適用→OK
f:id:okiraku894:20141103210220p:plain

確かにこれで,でろ~んは無くなった.

じゃ,でろ~ん出したいときどうする?
[windows key] + [c] で出てきます.やった!

Beamer導入覚書

そろそろBeamerが必要になってきたので大学/自宅両方に導入.
でも,きっとすぐ忘れるので,メモ.

  • ダウンロード(2011/11/13 現在)

◆Beamer本体 from CTAN の 冒頭 zip file Ver. 3.10
これ以前の Ver. だと 新しいgeometry packageと不具合があるようで(参照)
その場合,Beamerのbaseフォルダにある beamerbasecompatibility.sty を更新しなけらばならない.
つまり新しいパッチを CTAN からとってきて上書きする.
pgf(TeXで図を描くためのマクロ集) from Sourceforge Ver. 2.10
xcolor(TeXで色々色) from CTAN の 冒頭 zip file Ver. 2.11


Beamer関係はこれでいいのだけど,リアルタイムにpdfに編集更新を反映させるには,
やはりSumatraが良い.
Sumatra PDF ページの SumatraPDF-1.8-install.exe Ver. 1.8
◆これらのファイルの圧縮形式がさまざまなので,
例えば 解凍レンジ をあらかじめ用意しておくといい.

  • インストール

◆実は 角藤版Latex for windowsLatexを入れたなら,Beamer関係はみな入っている.
【Beamer】 C:\w32tex\share\texmf\tex\latex\beamer
【xcolor】 C:\w32tex\share\texmf\tex\latex\xcolor
【pgf】 C:\w32tex\share\texmf\tex\generic\pgf
個別にBeamerを入れるなら,\texmf\tex 以下のどこかに展開すれば良いんじゃないかな.

  • winshellとの接続

◆角藤版LatexにはTexworksというLatex用エディタがついているけど,
文字コードの関係でこれまでの資産が活用できなくなるため,これは使っていない.
winshellをSumatraと連動させて使う.以下自分の環境.
【主なプログラムの設定】

    • プログラム名:LaTeX

 exeファイル名:C:\w32tex\bin\platex.exe
 コマンドライン:-src-specials -interaction=nonstopmode "%s.tex"

    • プログラム名:DVIView

 exeファイル名:C:\w32tex\dviout\dviout.exe
 コマンドライン:-1 %s.dvi "# %l "%c.tex""

    • プログラム名:GSView

 exeファイル名:C:\gs\gs9.04\bin\gswin32.exe
 コマンドライン:"%s.ps"

    • プログラム名:PDFLaTeX

 exeファイル名:C:\w32tex\bin\dvipdfm.exe
 コマンドライン:"%s.dvi"

    • プログラム名:PDFView

 exeファイル名:C:\Program Files\SumatraPDF\SumatraPDF.exe
 コマンドライン:-reuse-instance "%s.pdf"
「-reuse-instance」 と入れることで,Sumatraの重複起動を避けられる.
また,「PDFLaTeXを先に実行」にチェックを入れておく.


【ユーザー指定プログラム】
LaTeXボタンで.texを.dviに→PDFLaTeXボタンで.dviを.pdfに→PDFVIEWで出来上がったpdfを見る
なんてやってられないので,ユーザー指定プログラムを設定

    • プログラム名:Sumatra

 exeファイル名:C:\Program Files\SumatraPDF\SumatraPDF.exe
 コマンドライン:-reuse-instance "%s.pdf"
更に,「LaTeXを先に実行」「PDFLaTeXを先に実行」2つにチェックを入れておく.
最後に,このユーザー指定プログラムを実行するためのボタンを
「オプション」→「表示」→「ユーザー設定」→「カテゴリー」→「ユーザー指定プログラム」
からボタンを作っておく.こうすれば,このボタン1つで全過程をしてくれる.


で,上手くいくんじゃないかな...

思わぬところで足を引っ張られるものだ

最近,持ち運びしてるHDDへのミラーリングが極端に遅くなった.
なんかSSDプチフリ対策でレジストリいじったからかな?
いや,windows7 64bitとこのHDDの相性がいけないのかな?
CrystalDiskMarkによれば本体のHDDには何ら問題なさそう.
だからポータブルHDDなんだ,原因は.
とにかく遅いんだ.
毎晩帰るとき,このせいで30分ぐらい足止めを食らう.
おかげで,随分ソリティアをやった.(←いやいや,論文書けよ)


2週間ほど前からずっと悩んでいた.
調べると古い時代にはPIO病なんてのもあったらしいが,
今回外付けのHDDだし,関係ないしな.
で,あれこれサイトを回り,可能性を一つずつ潰していったところ,
どうもPC内部の事情ではなく,もっと物理的なものだと行き着いた.
HDDのケーブル?いやいや,自宅ではきちんと動く.
となると,最近新しく買ったUSB Hub!
どれどれ,HDDを直接本体につなぐと...おお,元通り速い!
うわぁ,Hubかよ...
しかも,これをいいことに,USB3.0のポータブル注文してしまったじゃないか.





←これが本来の速さ















←あるHubにつなげると…
………
…使えるかっつうの!







dviからpdfで図が入らないとき

ときどきこれが起こって困る.特にwindows7 64bitにしてから.
もちろんOSとは無関係だろうし,環境設定がきちんとできていないからだろう.
で,本腰入れて調べてみた.
どうやら入れるべき図のEPSのVer.とpdfとの相性が悪いとおこるらしい.
そこで,どうしてもdvipdfm(x)で変換できないとき,
一度dvipsでpsに変換してからdistillerでpdfにすると良いらしい.
で,やってみたらがどうもdvipsで失敗してpsファイルを作ってくれない.
更に調べてみたら,ファイルに日本語が入っているかららしい.
で,これらに対応できるようにとdvipskがあるそうだ.
で,変えてみた.できたできた!


まとめ: platexでdvi → dvipskでps → distillerでpdf.


うん,興味のない人には
で?
だけどね.
自分のための覚書.