Tex, python, illusrator, VPSの学生ノート

latotex-blog

Python

Pythonで好きな画像を球に張り付ける!

投稿日:






フリー素材は便利ですが、自分の思い通りのデザインにならないのが残念なところ。

そこで、Pythonを使ってillustratorの素材を作ってみました。

ただ、Cartopyで地図をつくり張り付ける場合、ベクターデータ形式(eps,svgなど)で出力すると、

サイズが大きくイラレが応答しなくなるのでご注意ください。

完成したgifはこんな感じです

スポンサーリンク

使用した画像とPythonコード

使用した画像はこちらです。幅1152px、高さ648pxで作っています。

pythonコードにも書いておきましたが、pngファイルを多く出力することになるので、あらかじめpngを入れるディレクトリ(新しいフォルダー)を作ってください

#!/usr/bin/env python3

#必要なものを宣言
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from PIL import Image, ImageFilter
import numpy as np

#解像度の指定
set_dpi = 100

#できたpngファイルを入れる場所を指定
#たくさんのpngを保存するので、新しくディレクトリを作った方がよい
DIR1 = '/home/User/3D_plot/figs/'

#球の半径
radius = 15

#ここから作図
fig = plt.figure(figsize=(6,6))

ax = fig.add_subplot( 111 , projection='3d')


#グリットの最大値。radius<rmasにすること
rmax = 24
ax.set_xlim(-rmax,rmax)
ax.set_ylim(-rmax,rmax)
ax.set_zlim(-rmax,rmax)


#画像の読み込み
img = Image.open('artboard.png')

#RGBに変換。jpgの場合は必要なし
img = img.convert("RGB")

#RGBの範囲は0~1の値をとるため、256で割る作業をする。
mm = np.array(img)/256.


#緯度経度の指定
long = np.linspace(0, 2*np.pi, mm.shape[1])
lat = np.linspace(-0.5*np.pi, 0.5*np.pi, mm.shape[0])[::-1]

lat2, long2 = np.meshgrid(lat, long)

X = (radius*np.cos(lat2)*np.cos(long2)).T
Y = (radius*np.cos(lat2)*np.sin(long2)).T
Z = (radius*np.sin(lat2)).T


#ax.view_initの位置をmesで変化させることで、球が回る仕組み
for  mes in range(0, 90, 10):
	ax.plot_surface(X, Y, Z, facecolors = mm, shade=False, rstride=7, cstride=7)
	ax.view_init(elev=mes, azim=0)

	#軸、グリットの削除
	ax._axis3don = False

	#pngで保存
	fileo1 = DIR1 +'3dplot_' + str(mes) +'.png'
	plt.savefig(fileo1,dpi=set_dpi)

    

png出力が終わったら、ImageMagickを使ってgifに

gifにする場合は、出力したpngがあるディレクトリに移動(上のPythonコードでいうとDIR1)して

ImageMagickを使ってgifにします。PythonコードからImageMagickを呼び出すこともできますが、

コマンドライン(windowsの方はコマンドプロンプトから)以下の1行を入力してください。

gifのファイル名は自由につけて構いません。convertでうまくいかない場合は「magick convert」で試してみてください

$ convert -delay 5 -loop 0 3dplot_*.png 3dplot.gif


-Python

Copyright© latotex-blog , 2020 All Rights Reserved Powered by STINGER.