matplotlib - 如何在 OpenTURNS 的图形之外设置图例?
问题描述
我想用 OpenTURNS 创建高斯样本的对数似然的等高线图。每个等高线映射到一个函数值,该函数值由绘图的图例指示。问题是图例在某种程度上隐藏了轮廓:如何设置绘图以使图例不隐藏内容?
这是一个例子。我创建了一个Normal
与 20 至 79 岁之间的男性身高相对应的分布(参见“美国人口普查局的统计摘要。”表 209. 2012)。然后我从这个分布中生成一个样本。我定义了对数似然函数,它采用输入向量 (mu, sigma) 并返回一个包含对数似然输出的一维向量。我可以使用draw
这个函数的方法来创建等高线图。
import openturns as ot
import openturns.viewer as otv
mu = 1.763
sigma = 0.0680
N = ot.Normal(mu, sigma)
sample_size = 100
sample = N.getSample(sample_size)
def loglikelihood_gauss(X):
"""Compute the log-likelihood of a Gaussian sample."""
mu, sigma = X
N = ot.Normal(mu, sigma)
log_pdf = N.computeLogPDF(sample)
sample_size = sample.getSize()
log_likelihood = log_pdf.computeMean() * sample_size
return log_likelihood
# Contour plot
logLikelihoodFunction = ot.PythonFunction(2, 1, loglikelihood_gauss)
ot.ResourceMap_SetAsUnsignedInteger("Contour-DefaultLevelsNumber", 5)
graph = logLikelihoodFunction.draw([1.65, 0.04], [1.85, 0.15], [50]*2)
graph.setXTitle(r"$\mu$")
graph.setYTitle(r"$\sigma$")
graph.setTitle("Log-Likelihood.")
view = otv.View(graph)
这会产生:
如何设置绘图以使图例不隐藏轮廓?
解决方案
第一个技巧是使用matplotlib 函数的bbox_to_anchor
选项。legend
这是可能的,因为所有 OpenTURNS 图形都来自 Python 层的 Matplotlib。第二个技巧是View
根据方法从对象中获取图形getFigure
。没有进一步的代码,这会产生第二个图例,它位于正确的位置,但重复了图例。第三个技巧是通过将内容设置为空字符串来隐藏旧图例。
logLikelihoodFunction = ot.PythonFunction(2, 1, loglikelihood_gauss)
ot.ResourceMap_SetAsUnsignedInteger("Contour-DefaultLevelsNumber", 5)
graph = logLikelihoodFunction.draw([1.65, 0.04], [1.85, 0.15], [50]*2)
graph.setXTitle(r"$\mu$")
graph.setYTitle(r"$\sigma$")
graph.setTitle("Log-Likelihood.")
legends = graph.getLegends()
graph.setLegendPosition("")
view = otv.View(graph)
figure = view.getFigure()
figure.legend(legends, bbox_to_anchor=(1.1, 0.9))
保存图形时,图例可能会被裁剪。可能需要使用以下bbox_inches
选项:
figure.savefig("filename.png", bbox_inches="tight")
推荐阅读
- java - org.apache.poi.ooxml.schemas 找不到 SchemaTypeSystemImpl
- html - 存储和运行 html 的手机应用程序
- alfresco - Alfresco 错误 alfresco.fileupload 不是构造函数
- amazon-web-services - 在 aws ec2 上重定向后 codeigniter 3.1.11 会话数据丢失
- python - Python 新手。这个模数运算符我做错了什么?我收到语义错误
- reactjs - 构建的反应代码对逆向工程是否安全?
- html - “详细信息”标签的标记对我隐藏。如何避免?
- scala - Scala Play JSON:将哈希图转换为 json 对象而不是数组
- javascript - html to "pdf" 文本背景换行,但文本本身没有
- python - 使用单个字符串写入 CSV 每行返回 1 个字符