質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

1回答

2465閲覧

ggplot2のshapeを文字列の部分一致を利用して(?)変更したいです

退会済みユーザー

退会済みユーザー

総合スコア0

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

0クリップ

投稿2016/01/26 07:42

以下のようなデータフレームがあります
データフレーム"frame"
このデータフレームを材料に、ggplot2のgeom_pointメソッドを用いてグラフを書いています。
グラフはatt1が横軸、att2が縦軸の散分図です。
ここで、methodのtypeAではshape=1、typeBではshape=2となるようにしたいのです。

上では「文字列の部分一致を利用して」と書きましたが、部分一致でなくても構いません。
とにかく、上4つのデータと下4つのデータが違った形状でプロットしたいのです。

下に、自分で試してみたコードを載せておきます。
上から4行はshape=1、それ以外はshape=2となることを目指したコードです。

###ソースコード

R

1p <- ggplot(frame, aes(x = att1, y = att2)) 2p +geom_point(aes(color= method, size=4, 3 shape= ifelse(frame[1:4,], 1, 2) 4 ) 5 )

###発生している問題・エラーメッセージ
ifelse(frame[1:4,], 3, 2)でエラー:
(list)オブジェクトは'logical'に変換できません

###バージョン情報
R--3.2.2
ggplot2--1.0.1

どうかよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

次のような,ソースコードでグラフを得ることができました.

R

1library(ggplot2) 2library(stringr) 3method = c('typeA_1', 'typeA_2', 'typeA_3', 'typeA_4', 'typeB_1', 'typeB_2', 'typeB_3', 'typeB_4') 4att1 <- c(0.9991, 0.9998, 0.9956, 0.9960, 0.9802, 1.000, 0.9725, 0.9996) 5att2 <- c(5.883903, 7.113087, 38.118797, 126.598325, 113.170862, 21.012656, 281.632863, 81.178447) 6data <- data.frame(method = method, att1 = att1, att2 = att2) 7shape.factor <- as.factor(ifelse(str_detect(data[, 1], "A"), 1, 2)) 8 9p <- ggplot(data, aes(x = att1, y = att2)) 10p + geom_point(aes(color = method, size = 4, shape = shape.factor))

このソースコードを実行すると,次のグラフが得られます.
グラフ

ソースコードの説明ですが,

R

1str_detect(data[, 1], "A")

は,data[, 1]の文字列の中にAが入っていればTRUEを返し,入っていなければFALSEを返します.つまり,typeAであればTRUEを返し,typeBであればFALSEを返します.
data[, 1]はmethodを指しています.実際に実行して確かめてみてください.

つぎに,ifelse()によって,TRUEを1に,FALSEを2に変えます.
最後に,引数shapeはfactorクラスで渡さなければいけないので,as.factorで型変換しています.

投稿2016/01/29 09:46

t-kaneko

総合スコア61

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/01/30 04:25

丁寧に回答していただき、ありがとうございます! stringrを使うのは思いつきませんでした(というかパッケージの存在を知りませんでした) なるほどshapeはfactorクラスで渡す必要があったのですか・・・ もっとよくリファレンスを見るように心がけます。 凡例が少し見ずらいのは今後の課題とさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問