import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20base64%0A%20%20%20%20import%20importlib%0A%20%20%20%20import%20sys%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20import%20japanize_matplotlib%20%20%23%20noqa%3A%20F401%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20notebook_dir%20%3D%20Path(__file__).resolve().parent%20if%20%22__file__%22%20in%20globals()%20else%20Path.cwd()%0A%20%20%20%20repo_root%20%3D%20notebook_dir.parents%5B1%5D%0A%20%20%20%20output_dir%20%3D%20repo_root%20%2F%20%22data%22%20%2F%20%22others%22%20%2F%20%22matplotlib%22%0A%20%20%20%20output_dir.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%0A%20%20%20%20original_sys_path%20%3D%20list(sys.path)%0A%20%20%20%20sys.path%20%3D%20%5B%0A%20%20%20%20%20%20%20%20entry%0A%20%20%20%20%20%20%20%20for%20entry%20in%20sys.path%0A%20%20%20%20%20%20%20%20if%20Path(entry%20or%20%22.%22).resolve()%20!%3D%20notebook_dir.resolve()%0A%20%20%20%20%5D%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20importlib.import_module(%22matplotlib%22)%0A%20%20%20%20%20%20%20%20animation%20%3D%20importlib.import_module(%22matplotlib.animation%22)%0A%20%20%20%20%20%20%20%20plt%20%3D%20importlib.import_module(%22matplotlib.pyplot%22)%0A%20%20%20%20%20%20%20%20tableau_colors%20%3D%20importlib.import_module(%22matplotlib.colors%22).TABLEAU_COLORS%0A%20%20%20%20finally%3A%0A%20%20%20%20%20%20%20%20sys.path%20%3D%20original_sys_path%0A%20%20%20%20return%20animation%2C%20base64%2C%20mo%2C%20np%2C%20output_dir%2C%20plt%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20matplotlib%20%E3%81%AE%E3%83%87%E3%83%A2%0A%0A%20%20%20%20Colab%20%E5%9B%BA%E6%9C%89%E3%81%AE%20%60%25matplotlib%60%20%E3%82%84%20%60IPython.display%60%20%E3%81%AB%E9%A0%BC%E3%82%89%E3%81%9A%E3%80%81%0A%20%20%20%20%E9%9D%99%E6%AD%A2%E7%94%BB%E3%81%A8%20GIF%20%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%9F%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E9%9D%99%E6%AD%A2%E7%94%BB%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20output_dir%2C%20plt)%3A%0A%20%20%20%20x_basic%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%20100)%0A%20%20%20%20fig_basic%2C%20ax_basic%20%3D%20plt.subplots(figsize%3D(7%2C%204))%0A%20%20%20%20ax_basic.plot(x_basic%2C%20np.sin(x_basic)%2C%20label%3D%22sin%20%E6%B3%A2%22)%0A%20%20%20%20ax_basic.plot(x_basic%2C%20np.cos(x_basic)%2C%20label%3D%22cos%20%E6%B3%A2%22)%0A%20%20%20%20ax_basic.set_xlim(0%2C%202%20*%20np.pi)%0A%20%20%20%20ax_basic.set_ylim(-1.1%2C%201.1)%0A%20%20%20%20ax_basic.legend(loc%3D%22upper%20left%22)%0A%20%20%20%20ax_basic.set_title(%22sin%20%2F%20cos%22)%0A%20%20%20%20plot_path%20%3D%20output_dir%20%2F%20%22plot.png%22%0A%20%20%20%20fig_basic.savefig(plot_path%2C%20dpi%3D300%2C%20bbox_inches%3D%22tight%22)%0A%20%20%20%20fig_basic%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E8%89%B2%E4%BD%BF%E3%81%84%0A%0A%20%20%20%20%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E9%85%8D%E8%89%B2%E3%81%A8%E3%80%81%E8%89%B2%E7%9B%B8%E7%92%B0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB%E3%81%97%E3%81%9F%E9%85%8D%E8%89%B2%E3%82%92%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt)%3A%0A%20%20%20%20x_lines%20%3D%20np.linspace(0%2C%2010%2C%20100)%0A%20%20%20%20fig_default%2C%20ax_default%20%3D%20plt.subplots(figsize%3D(7%2C%205))%0A%20%20%20%20for%20_default_line_index%20in%20range(30)%3A%0A%20%20%20%20%20%20%20%20ax_default.plot(x_lines%2C%20_default_line_index%20*%20np.ones(len(x_lines)))%0A%20%20%20%20ax_default.set_title(%22matplotlib%20%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E9%85%8D%E8%89%B2%22)%0A%20%20%20%20fig_default%0A%20%20%20%20return%20(x_lines%2C)%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20plt)%3A%0A%20%20%20%20color_count%20%3D%20100%0A%20%20%20%20color_labels%20%3D%20np.arange(color_count)%0A%20%20%20%20rng_colors%20%3D%20np.random.default_rng(0)%0A%20%20%20%20rng_colors.shuffle(color_labels)%0A%0A%20%20%20%20def%20get_color(seed%3A%20int)%3A%0A%20%20%20%20%20%20%20%20return%20plt.get_cmap(%22hsv%22)(color_labels%5Bseed%5D%20%2F%20color_count)%5B%3A3%5D%0A%0A%20%20%20%20return%20(get_color%2C)%0A%0A%0A%40app.cell%0Adef%20_(get_color%2C%20np%2C%20plt%2C%20x_lines)%3A%0A%20%20%20%20fig_hsv%2C%20ax_hsv%20%3D%20plt.subplots(figsize%3D(7%2C%205))%0A%20%20%20%20for%20_hsv_line_index%20in%20range(30)%3A%0A%20%20%20%20%20%20%20%20ax_hsv.plot(%0A%20%20%20%20%20%20%20%20%20%20%20%20x_lines%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20_hsv_line_index%20*%20np.ones(len(x_lines))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3Dget_color(_hsv_line_index)%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20ax_hsv.set_title(%22%E8%89%B2%E7%9B%B8%E7%92%B0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E9%85%8D%E8%89%B2%22)%0A%20%20%20%20fig_hsv%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%8B%95%E7%94%BB%0A%0A%20%20%20%20%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AF%20GIF%20%E3%81%A8%E3%81%97%E3%81%A6%E4%BF%9D%E5%AD%98%E3%81%97%E3%80%81%E3%81%9D%E3%81%AE%E5%86%85%E5%AE%B9%E3%82%92%E3%83%8E%E3%83%BC%E3%83%88%E3%81%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20frame_count%20%3D%20100%0A%20%20%20%20time_start%20%3D%200.0%0A%20%20%20%20time_end%20%3D%2010.0%0A%20%20%20%20wave_length%20%3D%201.0%0A%20%20%20%20velocity%20%3D%200.5%0A%20%20%20%20return%20frame_count%2C%20time_end%2C%20time_start%2C%20velocity%2C%20wave_length%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20animation%2C%0A%20%20%20%20frame_count%2C%0A%20%20%20%20np%2C%0A%20%20%20%20output_dir%2C%0A%20%20%20%20plt%2C%0A%20%20%20%20time_end%2C%0A%20%20%20%20time_start%2C%0A%20%20%20%20velocity%2C%0A%20%20%20%20wave_length%2C%0A)%3A%0A%20%20%20%20fig_wave%2C%20ax_wave%20%3D%20plt.subplots(figsize%3D(7%2C%204))%0A%20%20%20%20x_wave%20%3D%20np.linspace(0%2C%202%20*%20np.pi%2C%201000)%0A%20%20%20%20ax_wave.set_xlim(0%2C%202%20*%20np.pi)%0A%20%20%20%20ax_wave.set_ylim(-1.1%2C%201.1)%0A%20%20%20%20line_sin%2C%20%3D%20ax_wave.plot(%5B%5D%2C%20%5B%5D%2C%20c%3D%22tab%3Ablue%22%2C%20label%3D%22sin%20%E6%B3%A2%22)%0A%20%20%20%20line_cos%2C%20%3D%20ax_wave.plot(%5B%5D%2C%20%5B%5D%2C%20c%3D%22tab%3Aorange%22%2C%20label%3D%22cos%20%E6%B3%A2%22)%0A%20%20%20%20ax_wave.legend(loc%3D%22upper%20right%22)%0A%0A%20%20%20%20def%20animate(frame%3A%20int)%3A%0A%20%20%20%20%20%20%20%20time_value%20%3D%20time_start%20%2B%20(time_end%20-%20time_start)%20%2F%20frame_count%20*%20frame%0A%20%20%20%20%20%20%20%20ax_wave.set_title(f%22frame%3D%7Bframe%7D%22)%0A%20%20%20%20%20%20%20%20line_sin.set_data(%0A%20%20%20%20%20%20%20%20%20%20%20%20x_wave%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20np.sin(2%20*%20np.pi%20%2F%20wave_length%20*%20(x_wave%20-%20velocity%20*%20time_value))%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20line_cos.set_data(%0A%20%20%20%20%20%20%20%20%20%20%20%20x_wave%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20np.cos(2%20*%20np.pi%20%2F%20wave_length%20*%20(x_wave%20-%20velocity%20*%20time_value))%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20return%20line_sin%2C%20line_cos%0A%0A%20%20%20%20wave_animation%20%3D%20animation.FuncAnimation(fig_wave%2C%20animate%2C%20frames%3Dframe_count%2C%20interval%3D100)%0A%20%20%20%20gif_path%20%3D%20output_dir%20%2F%20%22animation.gif%22%0A%20%20%20%20wave_animation.save(gif_path%2C%20writer%3D%22pillow%22%2C%20dpi%3D120)%0A%20%20%20%20return%20(gif_path%2C)%0A%0A%0A%40app.cell%0Adef%20_(base64%2C%20gif_path%2C%20mo)%3A%0A%20%20%20%20gif_base64%20%3D%20base64.b64encode(gif_path.read_bytes()).decode(%22ascii%22)%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%23%20GIF%20%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%0A%20%20%20%20%20%20%20%20%3Cimg%20src%3D%22data%3Aimage%2Fgif%3Bbase64%2C%7Bgif_base64%7D%22%20alt%3D%22sin%20%E3%81%A8%20cos%20%E3%81%AE%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%22%20%2F%3E%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
9ab095ba127a2f2b5d6df7fe71aed72b