Hatena::ブログ(Diary)

My Life as a Mock Quant このページをアンテナに追加 RSSフィード Twitter

2016-05-03

ggplot2で中が塗りつぶされていない長方形を描く

| 17:45 | ggplot2で中が塗りつぶされていない長方形を描くを含むブックマーク

使うたびにはまる系なのでめもる&答えはgeom_rect()でfill=NAとする。

library("ggplot2")
ggplot(mtcars, aes(qsec, mpg)) +
  geom_point()+
  geom_rect(aes(xmin=18, xmax=20, ymin=21, ymax=23), fill=NA, color="red")

f:id:teramonagi:20160503174628p:image

yutannihilationyutannihilation 2016/05/03 18:25 好みの問題な気もしますけど、geomだと他のレイヤーのデータとかaesのマッピングの影響を受けることがあるので、
長方形ひとつだけでいいならannotateのほうがオススメです。

ggplot(mtcars, aes(qsec, mpg)) +
geom_point()+
annotate("rect", xmin=18, xmax=20, ymin=21, ymax=23, fill="transparent", color="red")

2016-04-13

dplyr でグループごとに複数カラムを追加したい

| 08:33 | dplyr でグループごとに複数カラムを追加したいを含むブックマーク

に対する1回答。

> library("dplyr")
> library("tidyr")
> probs <- seq(0, 1, by=0.25)
> iris %>% group_by(Species) %>% 
+   summarize(tmp=list(data.frame(prob=probs, quantile=quantile(Sepal.Length, probs)))) %>%
+   tidyr::unnest() %>%
+   tidyr::spread(prob, quantile)
Source: local data frame [3 x 6]

     Species     0  0.25   0.5  0.75     1
      (fctr) (dbl) (dbl) (dbl) (dbl) (dbl)
1     setosa   4.3 4.800   5.0   5.2   5.8
2 versicolor   4.9 5.600   5.9   6.3   7.0
3  virginica   4.9 6.225   6.5   6.9   7.9

どうだろうか。

2016-03-27

ggplot2の軸を上付きのべき乗で書きたい

| 17:08 | ggplot2の軸を上付きのべき乗で書きたいを含むブックマーク

そういうことです。

今のところの私の答えは以下で

  • breaksでちゃんとX軸のどれを書くかを指定
  • trans_formatでべき乗表示に変換

です。

ggplot(data=data.frame(x=10^(1:4), y=1:4), aes(x=x, y=y)) + 
  scale_x_log10(breaks=10^(1:4), labels=trans_format('log10',math_format(10^.x)))+geom_point()

f:id:teramonagi:20160327170408p:image


以下、途中の試行錯誤

breaks指定なし+横軸LOGにしない場合

横軸の値があまりにいけてないマンになる。

ggplot(data=data.frame(x=10^(1:4), y=1:4), aes(x=x, y=y)) + 
  scale_x_continuous(labels=trans_format('log10',math_format(10^.x)))+geom_point()

f:id:teramonagi:20160327170407p:image

横軸をlog10にしない場合

さすがに見辛い

ggplot(data=data.frame(x=10^(1:4), y=1:4), aes(x=x, y=y)) + 
  scale_x_continuous(breaks=10^(1:4), labels=trans_format('log10',math_format(10^.x)))+geom_point()

f:id:teramonagi:20160327170406p:image

fancy_scientificをパクる場合

を参考にマルっとfancy_scientific関数をもらってきてからのPLOT。

breaksを陽に指定できない場合はこれでよい気もする。

fancy_scientific <- function(l) { 
  # turn in to character string in scientific notation 
  l <- format(l, scientific = TRUE) 
  # quote the part before the exponent to keep all the digits 
  l <- gsub("^(.*)e", "'\\1'e", l) 
  # turn the 'e+' into plotmath format 
  l <- gsub("e", "%*%10^", l) 
  # return this as an expression 
  parse(text=l) 
} 
ggplot(data=data.frame(x=10^(1:4), y=1:4), aes(x=x, y=y)) + 
  scale_x_continuous(labels=(labels=fancy_scientific))

f:id:teramonagi:20160327170405p:image

2016-03-21

ヘルスプラネットからデータを取得するパッケージを作った

| 10:49 | ヘルスプラネットからデータを取得するパッケージを作ったを含むブックマーク

はじめに

主に俺の健康を管理するために、ヘルスプラネットというタニタの運営するサービスのAPIを叩いてデータを取得するパッケージを作った。

とりあえずinnerscan系の情報

だけが取れるようになっている。

API経由で尿糖・歩数・血圧も取得できるようだが、俺の家にそれ用の計測機器がないので、とりあえず放置。

使い方

パッケージはGithubにしかないので、

install.packages("devtools")
devtools::install_github("teramonagi/healthplanet")

としてインストールする。

そして、ヘルスプラネットの会員登録を済ませて、

を手に入れた上で、以下のように使用することができる。

> access_token <- getToken()
> df <- getInnerScan(access_token)
> df
   sex birth_date heght                date    model basal_metabolic_rate body_age body_fat bone_mass muscle_mass muscle_score visceral_fat_level weight
1 male 1963-03-10   180 2016-03-16 06:49:00 01000099                 1685       43     20.9       3.1       56.70            0                9.5  75.60
2 male 1963-03-10   180 2016-03-17 08:04:00 01000099                 1705       44     21.4       3.1       57.30            0               10.0  76.85
3 male 1963-03-10   180 2016-03-18 05:48:00 01000099                 1677       44     21.2       3.1       56.45            0                9.5  75.55
4 male 1963-03-10   180 2016-03-19 07:11:00 01000099                 1667       44     21.2       3.1       56.15            0                9.5  75.15
5 male 1963-03-10   180 2016-03-20 06:39:00 01000099                 1687       43     20.5       3.1       56.80            0                9.5  75.35
6 male 1963-03-10   180 2016-03-21 05:28:00 01000099                 1675       43     20.7       3.1       56.40            0                9.5  75.00

試しに適当なデータを可視化してみよう。

下記コードで、脂っこいおじさんの体脂肪率可視化できる・・・が・・・これが俺の実データだとは一言も言っていない。

> library("ggplot2")
> ggplot(df, aes(x=as.Date(date), y=body_fat)) + geom_line(size=2) +  scale_x_date(date_labels="%Y/%m/%d")

f:id:teramonagi:20160321104847p:image

コードはこちら

認証周りの処理が一筋縄でいかなかったので、アドホックに動くようにした。

API仕様書はこちら

2016-03-12

標準入力を受け取りたい

| 18:16 | 標準入力を受け取りたいを含むブックマーク

そういう時もある。書き方結構あるなぁ。

書き方1

import scala.io.StdIn.readLine
object Main {
  def main(args: Array[String]){
    val Array(a, b) = readLine().split(" ").map(_.toInt)
    println((a,b))
    val s = readLine()
    println(s)
  }
}

実行例

$ scala App.scala
1 9
(1,9)
hogehoge 666
hogehoge 666
$ echo -e 1 3 \\n hogehoge | scala App.scala
(1,3)
 hogehoge

書き方2

import scala.io.StdIn.readLine
object Main {
  def main(args: Array[String]){
    for(line <- io.Source.stdin.getLines()) {
      val numAry = line.split(' ').map { _.toInt }
      println(numAry.sorted.mkString(" "))
    }
  }
}

実行例

$ echo -e 1 3 4 2 \\n3 2 1 3 2| scala App.scala
1 2 3 4
1 2 2 3 3

書き方3

object Main {
  def main(args: Array[String]): Unit = {
    val sc = new java.util.Scanner(System.in)
    val a, b = sc.nextInt()
    println(a)
    println(b)
  }
}