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

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

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

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

Q&A

解決済

3回答

1221閲覧

Rのggplot2で作図したグラフを拡張メタファイル(.emf)として余白無く出力したい

uzuraimo

総合スコア3

R

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

1グッド

0クリップ

投稿2023/05/29 09:47

実現したいこと

ggplot2で作図したグラフを拡張メタファイル(.emf)として余白無く出力したい

前提

R言語を用いた解析を行っています。
ggplot2を用いて作図したグラフを拡張メタファイル形式として出力し、パワーポイントなどで細かく編集することがあります。
その際に、グラフ部分だけを余白無く出力したいのですが、どうしても画像の右端、下端にわずかな余白ができてしまいます。
現在はパワポ上でトリミングしているのですが、可能ならRからの出力時に余白無く出力したいです。

該当のソースコード

R

1require(ggplot2) 2require(cowplot) 3require(devEMF) 4 5# 例として二次関数のデータフレームを用意 6df = data.frame(x=0:10, y=(0:10)^2) 7 8# 拡張メタファイルとして出力したい 9emf(file="test.emf") 10 11# x=0~10, y=0~100の範囲の二次関数のグラフを、余白無く作成したい 12gg = ggplot(df, aes(x=x, y=y)) 13gg = gg + 14 geom_line() + 15 theme_nothing() + 16 scale_x_continuous(expand=c(0,0), limits=c(0, 10)) + 17 scale_y_continuous(expand=c(0,0), limits=c(0, 100)) + 18 labs(x = NULL, y = NULL) 19 20# 言いたいことが伝わりやすいようにx=10とy=0に線を引く 21# 本当はこの線が図の一番右端および下端に来てほしい 22gg = gg + 23 geom_vline(xintercept=10, linewidth=1) + 24 geom_hline(yintercept=0, linewidth=1) 25 26# 作成したグラフを出力する 27plot(gg) 28dev.off()

上のコードを実行して出力される画像です(ここに表示するためにリサイズ・jpegへの圧縮を行いましたが、emfでも同じ図です)。
この水平線・垂直線の右と下に、わずかに余白が残ってしまうのが分かるでしょうか? これを無くしたいです。
イメージ説明

試したこと

theme_nothing()を用いず、ggの下に細かく余白を無くす条件を書くことも試しましたが、上手くいきませんでした。
他サイトで恐縮ですが、こちらも参考にしました。
https://qiita.com/ocean_f/items/03a31a8a7ce222bb3838
https://stackoverflow.com/questions/31254533/when-using-ggplot-in-r-how-do-i-remove-margins-surrounding-the-plot-area/31255629

補足情報(FW/ツールのバージョンなど)

R-4.3.0
RStudio 2023.03.1 Build 446

初めての質問で不手際等あるかもしれませんが、御指南いただければ幸いです。

cuttlefish44👍を押しています

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

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

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

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

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

guest

回答3

0

お世話になっております。
BAを差し上げた後、devEMFの開発者とやり取りしてきました。
https://github.com/plfjohnson/devEMF/issues/3

簡単に言うと、EMFファイルでは、数学的な境界とグラフィックフレーム上の境界の精度が異なるらしく、そのせいでグラフィックの右端と下端に余白が生じるそうです。
このissueを立てた後、devEMFがver.4.3.1→4.4に更新され、余白が「概ね」生じなくなりました。

「概ね」というのは、出力サイズによっては余白が生じたり生じなかったりするためです。
ただ、少なくともデフォルトの設定では余白は生じないようですし、emfファイルは後からのサイズ編集も容易です。
そのため、実用的には解決したと言って差し支えないかと存じます。
devEMF ver.4.4は、現在はgithubからのみインストール可能です。

初めてissueを立てたので内心ドキドキでしたが、無事に解決に至れました。
改めてありがとうございました。

投稿2023/06/13 05:48

uzuraimo

総合スコア3

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

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

0

ベストアンサー

細かい背景はさっぱりですが、2の累乗 / 10^hoge な数値 (5.12や10.24など)を width, heightに用いると
(少なくとも目視レベルでは) 余白が (ほとんど) 生じないように見えます

emf("test.emf", width = 5.12, height = 5.12, units = "in")

投稿2023/05/31 06:27

編集2023/05/31 06:29
cuttlefish44

総合スコア85

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

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

uzuraimo

2023/06/01 03:27

ご回答ありがとうございます。 頂いたサイズで試したところ、私の方でも再現できました。 頂いたご回答から、dpiの初期値が悪さをしているのではないかと思い立ち、色々と変えて試してみました。 後ほどまたコメントしようと思いますが、やはりサイズとdpiの相性によって余白のサイズが決まっているようですね。 試しに5 in × 5 in , 500dpiで出力してみたところ、同じようにほぼ余白なく出力できました。 この設定でも描画サイズが2501×2501にされてしまい、余白が1ピクセル幅だけ出てくるのがとても気に入りませんが……実用面で見るとほぼ問題無いと思われます。 細かい部分は今夜調べようと思います。 取り急ぎですが失礼します。
cuttlefish44

2023/06/01 05:16

ヒントになったようで何よりです バグに該当するかは微妙なラインですが、 gitでissue立てれば対応ないし良い設定が教えてもらえるかもしれませんね
uzuraimo

2023/06/01 12:52

お二方ともありがとうございます。 あの後も色々とwidth,height,coordDPIを変えて試してみましたが、やはり相性の良い悪いがあるようです。 内部の処理で丸め誤差でも発生しているのでしょうか。。 とりあえず、人の目に分かりやすい以下の設定値を使っていこうと思います: emf(file="test.emf", bg="transparent", width=5, height=5, units="in", coordDPI=250) とりあえずこれで余白幅が最小になり、実用上問題無くなりました! ただ、この余白の挙動自体はバグのような気がしますので、手が空いた時にでもissue投げてきたいと思います。 次に、KojiDoiさんから頂いたissueですが、中身を読んで書いてある対処法を試してみても特に解決しませんでした。 恐らくdevEMFパッケージ側の問題なのだろうと思います。 ところで、issueを読みつつ色々と試してみたのですが、ggsaveで普通に余白のないemfファイルを作成することができました。 元々、ggsaveで作成した時に余白が出来てしまい、それを無くすためにdevEMFに乗り換えたという事情があるのですが……。どうして上手くいったのか分からず困惑しております。 家と職場のPC環境が異なるので、また明日以降職場で確認しなければならないのですが、もしかしたらggsaveに戻ってもいいかもしれません。 もし同じ悩みの方がいらっしゃるのであれば、ggsaveも試してみてください。 (ggsaveはemfを扱うには相当相性悪いと思いますが……) ggsave("test.emf", gg, bg="transparent", width=7, height=7, units="cm") 最後に、ここまでお付き合いくださったお二方に感謝いたします。 両方にBA差し上げたいのですが、今回は実用上の解決を示してくれたcuttlefish44さんに差し上げようと思います。 ありがとうございました!
guest

0

私が試した範囲では、png()やsvg()を使った出力では余白は生じないように見えました。
パワポで編集可能なベクター画像が入用であれば、svgが使えると思います。

投稿2023/05/30 04:47

KojiDoi

総合スコア13676

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

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

uzuraimo

2023/05/30 10:56

ご回答ありがとうございます。 svg()で余白が無さそうなことは確認いたしました。 ただ、他のツールの出力も基本的にemfを用いており、またチームとしてemfを用いるのが現在主流となっているため、なるべくemfとして出力したいという気持ちがあります。 また、svgをパワポで扱うにも一旦別ツール(Inkscapeなど)を経由しないといけない環境のため、Rから直接emfを出力してそのまま扱うのが望ましいです。 表題の処理が無理そうなら諦め、ご教示いただいた方法を用いるのが次善ではあると思うのですが、何か自分の知らないスマートな方法があるのではないか、と思い質問させていただいた次第です。
KojiDoi

2023/05/30 14:33

どうやってもemfを出力するときだけは変な空白が入ってしまいますね。残念ながらはじめからまともなemfを得る方法は私にも見出せませんでした。 スマートではないかもしれませんが、パワポ上でトリミングするよりはマシな方法としては、windows版imagemagickが使えるのではないかと思います。 https://imagemagick.org/Usage/crop/#trim
uzuraimo

2023/05/31 02:43

ご丁寧にありがとうございます。 devEMFパッケージは綺麗に出力してくれるので重宝しているのですが、ここだけ惜しいんですよね。 自分のチームの使い方がニッチすぎるというのはあると思いますが……。 出力されたemfを自動でトリミングする方法は、頂いたアイディアも含めて検討してみようと思います。 余白のサイズが毎回絶対的または相対的に等しいサイズで出力されてしまうのであれば、自動でのトリミングもかなり楽に実装できると思いますので、調べているところです。 実現したいことからすると概ね解決といって差し支えないのですが、直接的な解決案を他の方から頂ける可能性もあるため、もうしばらく回答受付中とさせていただきます。 ご了承ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問