pyotr
@pyotr

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Rのgtで作った表を透過する方法

Discussion

Closed

gtで作成した表をR上透過して保存する方法

具体的には、背景色のついたスライドにgtで作った表を貼りたい状況などを想定しています。gtgtsaveだけではどうやらできない & (常識なのかもしれませんが)少し調べた所では方法が分からなかったのでメモしておきます。
R上で完結したより良い方法・代替案があればお教えください。

ggplot2で作成したグラフを透過して保存する方法としては、

p <- p + theme(plot.background = element_rect(fill="transparent", color=NA))

ggsave("ファイル名.png",p,bg="transparent")

とすれば良いのは有名かと思います。なお、単にthemeで透過するように設定しておいても、bgを指定しなかったり、Rstudioのexportから書き出したりすると透過されません。

gtgtsaveはggplotの表版のようなパッケージとして知られていますが、これらのオプションはどうやら存在しません。

調べたところstackoverflowVolcengine(中国版のstackoverflowみたいなもの)がヒットしましたが、どちらの方法もうまく行きませんでした。

これらの方法についても後ろでご紹介しますが、アップデート等で使えなくなった等の可能性もあるかと思います。この点何かご存知の方いらしたら教えていただけると嬉しいです。Rのバージョンは4.3.1です。

gtで作成した表を透過

library(gtsummary)
library(magick)

h=head(iris)
table=h %>%
  gt() %>%
  tab_options(table.background.color = "white")
  

とすると、背景色が白の表が作成されるので、magickパッケージを用いて

img_t=img%>%
    image_transparent(color="white") #指定色の部分(ここでは白)を透過
image_write(img_t, "table.tp.png")

とすることで背景を透過することができます。
ここでは白を使っていますが、図中の文字などと色が被っていなければなんでも良いです。
これでできるものの、なんだかもっと良い方法がありそうな気がするので、知っている方がいらしたら教えていただきたいです。

検索すると出てくるがうまくいかない方法

①背景色を透明に指定

stackoverflowの方ではCSSカラーコードで透明度を指定し

tab_options(table.background.color = "#FFFFFF00")

とすれば良いとなっていますが、これによって得られた表をgtsaveで保存すると透明度を指定せずに

tab_options(table.background.color = "#FFFFFF") 

とした場合と変わらない結果になってしまいます。なお、

tab_options(table.background.color = "transparent")

でも同じです。

この「背景を透明に指定しても、単に書き出すと不透明になっている」のはggplot2でも同じ(こうなる理由をご存知でしたら教えていただきたいです)なのですが、gtsaveggsaveと違ってbgが引数にありません。stackoverflowにはこの点を勘違いしたコメントも付いているように見えます。

②magickを使用

Volcengineの方ではmagickパッケージを利用してアルファ値を指定しようとしているのか

image_convert(img, "-alpha set -channel a -evaluate set 0.5", "table_img.png")

となっていますが、Rのヘルプを見てもimage_convertはこのような引数をとる関数ではありません(この点も何かご存知の方いらしたら教えてください)。

0

私の認識では、gtsaveはwebshot2 packageを使用しています(https://gt.rstudio.com/reference/gtsave.html)。
webshotはhtml上の何かをスクリーンショットしているだけなので、いくらgt側で透明度をいじっても最終的には背景の透明度まで保持はしてくれないのだと思います。

gtからhtml(あるいはtexなど)に出力後、別の方法で保存するしか方法はないかもしれません(いい方法があれば私にも教えてください)。

gtでは無理ですが、flextable packageであれば可能でした。

head(iris) %>%
flextable() %>%
bg(part="all", bg="transparent") %>%
save_as_image(path="hoge.png")

gtsummary(gtからは難しそう)からflextableには互換性があるので、

iris %>%
tbl_summary() %>%
as_flex_table() %>%
bg(part="all", bg="transparent") %>%
save_as_image(path="hoge.png")
などでもいけます。

お役に立てば幸いです。

1Like

Your answer might help someone💌