Streamlit中Seaborn Objects图表主题自定义失效问题求助
Seaborn Objects自定义主题在Streamlit中不生效的解决方法
问题原因
当提前通过plt.subplots()创建matplotlib轴对象后,Seaborn Objects的.theme()无法覆盖已初始化轴的样式——.theme()仅在图表初始化阶段生效,对已存在的轴不起作用。
解决方案1:让Seaborn Objects全权生成图表
无需提前创建matplotlib的fig和ax,直接让Seaborn Objects生成图表并传给Streamlit,此时.theme()设置会正常生效:
import streamlit as st import seaborn as sns import seaborn.objects as so import pandas as pd import numpy as np def main(): theme_dict = {**sns.axes_style("darkgrid"), "grid.linestyle": "--"} df = pd.DataFrame({"x": np.arange(100), "y": np.sin(np.arange(100) / 10)}) # 由seaborn objects生成图表,直接传入st.pyplot plot = so.Plot(df, x="x", y="y").add(so.Bars()).theme(theme_dict) st.pyplot(plot) if __name__ == "__main__": main()
解决方案2:在创建轴前应用自定义样式
如果必须提前创建fig和ax,可通过matplotlib的样式上下文管理器,在创建轴前应用自定义主题:
import streamlit as st import seaborn as sns import seaborn.objects as so import matplotlib.pyplot as plt import pandas as pd import numpy as np def main(): theme_dict = {**sns.axes_style("darkgrid"), "grid.linestyle": "--"} # 用上下文管理器包裹轴创建与绘图过程,确保样式生效 with plt.style.context(theme_dict): fig, ax = plt.subplots(1, 1) df = pd.DataFrame({"x": np.arange(100), "y": np.sin(np.arange(100) / 10)}) so.Plot(df, x="x", y="y").add(so.Bars()).on(ax).plot() st.pyplot(fig) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者divingTobi
相关产品推荐
相关产品推荐

