R言語でggplot2を使って散布図を作成する例

⚡ スマートサマリー

R の ggplot2 を使用した散布図では、geom_point() を使用して 2 つの連続変数を x 軸と y 軸にマッピングします。このチュートリアルでは、グループについて説明します。ping 色、対数変換、適合回帰直線、ラベル、ファセット、オーバープロットの修正、スケール、テーマ、および保存による設定。

  • 📍 基本構文: ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() はデータとマップからプロットを作成しますpingそして幾何学。
  • 🎨 グループで色を塗る: geom_point() 内の aes(color = factor(gear)) は、ファクターレベルごとにポイントを 1 つの色に分割します。
  • 📈 傾向線: stat_smooth(method = “lm”) は適合した回帰直線を重ねて表示し、se = FALSE は信頼区間を削除します。
  • 🗂️ ファセット: facet_wrap() は、共有スケール上でグループごとに 1 つのパネルを描画します。これは、すべての系列を 1 つのグラフに詰め込むよりも優れています。
  • 🔁 オーバープロット: マーカーが重なり合う場合は、アルファ値を下げたり、ポイントをジッターさせたり、geom_hex() に切り替えたりしてください。
  • 💾 書き出す: ggsave(“plot.png”, width = 8, height = 5, dpi = 300) は、最後のプロットを作業ディレクトリに書き込みます。

ggplot2を使ったRでの散布図

データ分析においてグラフが重要な理由

グラフはデータ分析プロセスの XNUMX 番目の部分です。 最初の部分は次のとおりです データ例trac生産、第 XNUMX 部では次のことを扱います。 データのクリーニングと操作。 最後に、データ サイエンティストは次のことを行う必要があるかもしれません。 結果をグラフィックで伝える.

データサイエンティストのワークフローを以下の図にまとめました。

  • データ サイエンティストの最初のタスクは、研究課題を定義することです。 この研究課題は、プロジェクトの目的と目標によって異なります。
  • その後、最も重要なタスクの XNUMX つは特徴量エンジニアリングです。 データ サイエンティストはデータを収集、操作、クリーンアップする必要があります
  • このステップが完了すると、データセットの探索を開始できます。 場合によっては、新しい発見により、元の仮説を改良したり、変更したりする必要があります。

R の散布図

  • 説明 分析が完了したら、データ サイエンティストは読者の能力を考慮する必要があります。 基礎となる概念とモデルを理解する.
  • 彼の結果は、すべての利害関係者が理解できる形式で提示される必要があります。 最良の方法の XNUMX つは、 伝える 結果は グラフ.
  • グラフは複雑な分析を簡素化する素晴らしいツールです。

このチュートリアルの残りの部分では、ggplot2パッケージを使用してこれらのグラフを作成します。

ggplot2パッケージ

このチュートリアルでは、R言語でggplot2を使ってグラフを作成する方法に焦点を当てます。

このチュートリアルでは、ggplot2 パッケージを使用します。このパッケージは、2005 年に Leland Wilkinson によって記述されたグラフィックスの文法を実装しています。ggplot2 は柔軟性があり、多くのテーマが付属しており、高度なレベルでプロットを指定できます。tracなお、このソフトウェアは3次元グラフィックやインタラクティブなグラフィックは生成しません。それらにはplotlyやrglなどのパッケージが必要です。

ggplot2 では、グラフは次の引数で構成されます。

  • データ
  • 美的マップping
  • 幾何学的なオブジェクト
  • 統計的変換
  • 座標系
  • 位置調整
  • ファセット

チュートリアルでは、これらの引数を制御する方法を学びます。

ggplot2 の基本構文は次のとおりです。

ggplot(data, mapping=aes()) +
geometric object 

arguments: 
data: Dataset used to plot the graph
mapping: Control the x and y-axis 
geometric object: The type of plot you want to show. The most common object are:
 
- Point: `geom_point()` 
- Bar: `geom_bar()`
- Line: `geom_line()` 
- Histogram: `geom_histogram()`

Rで散布図を作成する方法

ggplot が mtcars データセットでどのように動作するかを見てみましょう。 まず、mpg 変数と drat 変数の散布図をプロットします。

基本的な散布図

library(ggplot2)
ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point()

Code 説明

  • まず、データセット mtcars を ggplot に渡します。
  • aes() 引数内に、x 軸と y 軸を追加します。
  • + 記号は、R にコードの読み取りを継続させることを意味します。コードを分割することで、コードが読みやすくなります。
  • 幾何学オブジェクトには geom_point() を使用します。

出力:

基本的な散布図

グループによる散布図

場合によっては、データのグループ (つまり、因子レベルのデータ) によって値を区別すると興味深い場合があります。

ggplot(mtcars, aes(x = mpg, y = drat)) +
    geom_point(aes(color = factor(gear)))

Code 説明

  • geom_point() 内の aes() は、各グループの色を制御します。ping 変数は因子でなければならないので、gear は factor() でラップされます。
  • これで、ドットの色を変更するコード aes(color =要因(gear)) が完成しました。

出力:

グループによる散布図

対数変換で軸のスケールを変更する

生の変数はきれいなベル型分布を示すことは稀であるため、データのスケーリングはアナリストの仕事の大きな部分を占めます。対数を取ることは、極端な値を圧縮し、グラフが外れ値の影響を受けにくくする一つの方法です。

ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
    geom_point(aes(color = factor(gear)))

Code 説明

  • log() 関数内の x 変数と y 変数を aes() マップ内で直接変換します。ping.

標準化や正規化など、他の変換も適用できることに注意してください。

出力:

軸の変更

近似値を含む散布図

グラフに別のレベルの情報を追加できます。適合値を重ね合わせることができます。 線形回帰.

my_graph <- ggplot(mtcars, aes(x = log(mpg), y = log(drat))) +
    geom_point(aes(color = factor(gear))) +
    stat_smooth(method = "lm",
        col = "#C42126",
        se = FALSE,
        size = 1)
my_graph

Code 説明

  • my_graph: プロットはオブジェクト my_graph に格納されるため、後続のステップでは呼び出し全体を繰り返すことなくレイヤーを追加できます。
  • 引数 stat_smooth() は平滑化メソッドを制御します
  • Method = “lm”: 線形回帰
  • col = “#C42126”: Code 線の赤色について
  • se = FALSE: 標準エラーを表示しません。
  • size = 1: 線の太さ。ggplot2 3.4.0 以降では、この引数は線形状の場合、linewidth という名前に変更されました。

出力:

適合値を含む散布図

他の平滑化方法も利用できることに注意してください

  • グルム
  • 交歓
  • loess:観測値が1,000件未満の場合のデフォルト設定
  • rlm: MASSパッケージに含まれるロバスト線形モデル

グラフのスタイルを設定する前に、散布図がそもそも適切な選択肢となるのはどのような場合かを知っておくことが重要です。

散布図 vs 折れ線グラフ vs BubblR言語のeチャート

3つとも2つの連続変数を互いにプロットしているので、どれを選ぶかは読者が何を読み取るべきかという点に尽きる。

基準 散布図 折れ線グラフ Bubbleチャート
作品 2つの変数間の相関関係 順序軸に沿った1つの変数の変化 相関関係に3つ目の大きさを加えたもの
X軸 任意の連続変数 通常、時間または別の順序尺度 任意の連続変数
ポイントオーダー 無関係 重要なポイントはつながっています 無関係
第三の変数 色や形を通して 別々の回線を通して ポイントサイズを通して
ggplot2呼び出し ジオムポイント() geom_line() geom_point(aes(size = z))

x軸に自然な順序がない場合に散布点を線で結ぶのはよくある間違いです。これは存在しない順序を暗示しています。geom_line()は日付などの順序付き軸のために予約してください。単一変数の分布には、 箱ひげ図 を代わりにお使いください。

グラフに情報を追加する

現状では、グラフには説明文が一切ありません。読者は、追加の資料を参照することなく、グラフだけでデータの内容を把握できる必要があります。つまり、グラフには適切なラベルが必要です。ラベルは labs() 関数を使って追加できます。

labs() の基本的な構文は次のとおりです。

labs(title = "Hello Guru99")
arguments:
- title: Main title displayed above the plot
- subtitle: Secondary line below the title
- caption: Note below the plot, usually the data source
- x: Rename the x-axis
- y: Rename the y-axis
- color / fill: Rename the legend

Example: labs(title = "Hello Guru99", subtitle = "My first plot")

タイトルを追加

追加する必須の情報の XNUMX つは、明らかにタイトルです。

my_graph +
    labs(
        title = "Plot Mile per hours and drat, in log"
         )

Code 説明

  • my_graph: 保存したグラフを使用します。 これにより、グラフに新しい情報を追加するたびにすべてのコードを書き直す必要がなくなります。
  • タイトルをlabs()で囲みます。

出力:

タイトルを追加する

動的な名前を付けてタイトルを追加する

動的なタイトルは、タイトルにより正確な情報を追加するのに役立ちます。

Past() 関数を使用すると、静的テキストと動的テキストを印刷できます。 past() の基本構文は次のとおりです。

paste("This is a text", A)
arguments
- " ": Text inside the quotation marks are the static text
- A: Display the variable stored in A
- Note you can add as much static text and variable as you want. You need to separate them with a comma	

例:

A <- 2010
paste("The first year is", A)

出力:

## [1] "The first year is 2010"
B <- 2018
paste("The first year is", A, "and the last year is", B)

出力:

## [1] "The first year is 2010 and the last year is 2018"

グラフに動的な名前、つまり mpg の平均を追加できます。

mean_mpg <- mean(mtcars$mpg)
my_graph + labs(
    title = paste("Plot Mile per hours and drat, in log. Average mpg is", mean_mpg)
)

Code 説明

  • mpgの平均を作成するには、mean(mtcars$mpg)をmean_mpg変数に保存します。
  • mpg の平均値を返す動的なタイトルを作成するには、mean_mpg で past() を使用します。

出力:

動的な名前を付けてタイトルを追加する

サブタイトルを追加する

さらに2つの詳細情報を加えることで、グラフの理解が深まります。それは、サブタイトルとキャプションのことです。サブタイトルはタイトルのすぐ下に表示されます。キャプションには、計算を行った人物やデータの出典などが記載されます。

my_graph +
    labs(
        title =
        "Relation between Mile per hours and drat",
        subtitle =
        "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Code 説明

  • labs() 内に以下を追加しました:
    • title = “マイル/時間とdratの関係”: タイトルを追加
    • サブタイトル = 「ギアクラス別の関係性の内訳」: サブタイトルを追加
    • caption = “著者自身の計算: キャプションを追加
    • 新しい情報はそれぞれカンマ、, で区切ります。
  • コード行を分割していることに注意してください。 これは強制ではなく、コードを読みやすくするためにのみ役立ちます。

出力:

字幕を追加する

x 軸と y 軸の名前を変更する

列名は、プレゼンテーションに適した形式になっていないことがほとんどです。多くの場合、GDP_CAP のように、略語が使われていたり、単語間にアンダースコアが使われていたりします。グラフ上では列名を変更し、必要に応じて単位を追加してください。

my_graph +
    labs(
        x = "Drat definition",
        y = "Mile per hours",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Code 説明

  • labs() 内に以下を追加しました:
    • x = 「ドラット定義」: x 軸の名前を変更します。
    • y = “マイル/時間”: y軸の名前を変更する

出力:

x 軸と y 軸の名前を変更する

スケールを制御する

軸のスケールを制御できます。

関数 seq() は、一連の数値を作成する必要がある場合に便利です。 基本的な構文は次のとおりです。

seq(begin, last, by = x)
arguments:
- begin: First number of the sequence
- last: Last number of the sequence
- by= x: The step. For instance, if x is 2, the code adds 2 to `begin-1` until it reaches `last`	

例えば、0から12までの範囲で4刻みの場合、0、4、8、12という4つの数値が返されます。

seq(0, 12,4)

出力:

## [1]  0  4  8 12

以下のように、x 軸と y 軸のスケールを制御できます。

my_graph +
    scale_x_continuous(breaks = seq(1, 3.6, by = 0.2)) +
    scale_y_continuous(breaks = seq(1, 1.6, by = 0.1)) +
    labs(
        x = "Drat definition",
        y = "Mile per hours",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

Code 説明

  • 関数scale_y_continuous()は、 Y軸
  • 関数scale_x_continuous() は、 X軸.
  • パラメータ Breaks は軸の分割を制御します。 一連の数値を手動で追加することも、seq() 関数を使用することもできます。
    • seq(1, 3.6, by = 0.2): 1から3.6までのシーケンスを0.2刻みで作成します。つまり、14個のブレークポイントがあります。
    • seq(1, 1.6, by = 0.1): 1から1.6までの7つの数値を0.1刻みで生成します。

出力:

スケールを制御する

テーマ

最後に、ggplot2では、単一のテーマ関数でプロット全体のスタイルを変更できます。パッケージには8つの完全なテーマが同梱されています。

  • テーマbw()
  • テーマライト()
  • theme_classic()
  • テーマラインドロー()
  • テーマ_ダーク()
  • テーマミニマル()
  • テーマグレー()
  • テーマ_void()
my_graph +
    theme_dark() +
    labs(
        x = "Drat definition, in log",
        y = "Mile per hours, in log",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

出力:

テーマ

プロットの保存

これらの手順をすべて終えたら、グラフを保存して共有しましょう。グラフを描画した直後に ggsave(“name_of_the_file.png”) を呼び出すと、画像がディスクに書き込まれます。

グラフは作業ディレクトリに保存されます。 作業ディレクトリを確認するには、次のコードを実行します。

directory <- getwd()
directory

完成したグラフをプロットし、保存して、結果を確認してください。

my_graph +
    theme_dark() +
    labs(
        x = "Drat definition, in log",
        y = "Mile per hours, in log",
        color = "Gear",
        title = "Relation between Mile per hours and drat",
        subtitle = "Relationship break down by gear class",
        caption = "Authors own computation"
    )

出力:

プロットの保存

ggsave("my_fantastic_plot.png")

出力:

## Saving 5 x 4 in image

お願い注: 教育目的のみで、ディレクトリ フォルダーを開くための open_folder() という関数を作成しました。 以下のコードを実行して、画像がどこに保存されているかを確認するだけです。 my_fantastic_plot.png という名前のファイルが表示されるはずです。

# Run this code to create the function
open_folder <- function(dir) {
    if (.Platform['OS.type'] == "windows") {
        shell.exec(dir)
    } else {
        system(paste(Sys.getenv("R_BROWSER"), dir))
    }
}

# Call the function to open the folder
open_folder(directory)

facet_wrap() 関数を使って R でファセット散布図を作成する方法

ファセット化は、先に挙げた 8 つの ggplot2 コンポーネントの 1 つであり、グラフが混雑している場合に最も簡潔な解決策となります。すべてのグループを 1 つのパネルに詰め込むのではなく、ggplot2 は変数の各レベルに対して小さな複数のパネルを描画します。これらのパネルはすべて同じスケールで表示されるため、パネル間の比較が容易になります。

# One panel per gear count
ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point() +
    facet_wrap(~ gear) +
    theme_classic()

3つの論点が大部分の役割を果たしている。

  • ncol or ナロウ: パネルを特定のレイアウトに強制的に配置します。たとえば、facet_wrap(~ gear, ncol = 2) のように指定します。
  • デフォルトでは「fixed」に設定されているため、すべてのパネルが同じ軸範囲を共有します。グループの大きさが大きく異なる場合は、「free_y」または「free」を使用してください。ただし、フリースケールではパネル間の視覚的な比較が誤解を招く可能性があることに注意してください。
  • ラベラー: 各ストリップの生の係数レベルを置き換えます。たとえば、labeller = label_both とすると、「4」の代わりに「gear: 4」と表示されます。

2つのグループping 変数。 facet_grid() を使用して、最初の変数を行に、2番目の変数を列に配置したパネルのマトリックスを作成します。

ggplot(mtcars, aes(x = drat, y = mpg)) +
    geom_point(aes(color = factor(cyl))) +
    facet_grid(am ~ gear) +
    theme_classic()

面か、色か? グラフ上でグループが4つ程度で、かつ重なりが少ない場合は、色分けの方が効果的です。それ以上のグループ、またはグループが大きく重なり合う場合は、各パネルにそれぞれのデータポイントのみが表示されるため、ファセット表示の方が読みやすくなります。上記のfacet_grid()の例のように、1つの変数でファセット表示し、別の変数で色分けするなど、両方を組み合わせることも可能です。

Rの散布図でオーバープロットを処理する方法

数十個の観測では、すべての点が見える。数千個になると、マーカーが積み重なり、最も密度の高い領域は単なる塊として読み取られる。 重ね書きggplot2には4つの標準的な解決策が用意されています。

1. 透明度を下げる。 最も安価な解決策。重複ping 点が自然に暗くなるため、密度が視覚的に確認できる。

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_point(alpha = 0.05) +
    theme_classic()

2. ジッターは離散値です。 変数がごく少数の値しか取らない場合、点はすべて同じ座標に位置します。それらの点の間には、わずかなランダムなずれが生じます。

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
    geom_jitter(width = 0.15, height = 0) +
    theme_classic()

高さを0に設定することで、実際の情報を含むy値が変更されることがなくなります。

3. 飛行機を廃棄する。 大規模なデータセットの場合、セルごとの観測数をカウントし、そのカウントを色にマッピングします。六角形のビンを使用すると、正方形のビンで発生する視覚的なアーティファクトを回避できます。

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_hex(bins = 40) +
    theme_classic()

4. 密度等高線を描く。 等高線は観測データが集中する領域を示し、薄い点の上にきれいに重なり合っている。

ggplot(diamonds, aes(x = carat, y = price)) +
    geom_point(alpha = 0.05) +
    geom_density_2d(color = "#C42126") +
    theme_classic()

経験則として、アルファは数千点のデータポイントを処理し、六角形ビニングは数万点のデータポイントを処理し、それ以上のデータポイントを処理するには、dplyr::slice_sample() を使用してデータをサンプリングするのが現実的な選択肢です。

R言語での散布図: Code 参 考

以下の表は、上記で説明した各オプションに対応するggplot2の呼び出しを示しています。

DevOps Tools Engineer試験のObjective Code
基本的な散布図
ggplot(df, aes(x = x1, y = y)) + geom_point()
色分けされた散布図
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2)))
近似値を追加
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm")
表題を加える
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99"))
字幕を追加
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99"))
x の名前を変更する
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1")
y の名前を変更します
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1")
スケールを制御する
ggplot(df, aes(x = x1, y = y)) + geom_point() + scale_y_continuous(breaks = seq(10, 35, by = 10)) + scale_x_continuous(breaks = seq(2, 5, by = 1))
ログの作成
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point()
テーマ
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic()
グループによるファセット
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2)
オーバープロットの処理
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3)
Save
ggsave("my_fantastic_plot.png")

よくあるご質問

geom_point() は、すべての観測値をその正確な座標に描画します。geom_jitter() は、小さなランダムな変位を加えることで、同じ値を持つ点を区別できるようにします。これは、一方の軸が離散値を持つ場合に重要になります。

aes() 関数内では、color は変数をマッピングするため、ggplot2 はレベルごとに 1 つの色を割り当てて凡例を作成します。aes() 関数外では、color はすべての点に適用される固定定数となり、凡例は表示されません。

geom_point() の後に stat_smooth(method = “lm”) または geom_smooth(method = “lm”) を追加してください。信頼区間を非表示にするには se = FALSE に設定し、非線形平滑化には method = “loess” を使用してください。

散布図は、トレーニング前に特徴量の相関関係や外れ値を明らかにするものであり、予測値と実測値を比較表示したり、PCAやt-SNEによる次元削減後にクラスターを視覚化したりする標準的な方法です。

はい。AIアシスタントはレイヤーの作成、オーバープロットの修正提案、aes()ラッパーの欠落などのエラーの説明を行うことができます。列名や因子型は間違えやすいので、生成されたコードを自分のデータで実行してください。