我熟悉以下问题:
看起来这些问题的答案很有可能摆脱轴的精确收缩,以便传说适合.
然而,收缩轴并不是一个理想的解决方案,因为它使数据变得更小,使得它实际上更难以解释; 特别是当它的复杂和有很多事情发生时...因此需要一个大的传奇
文档中复杂图例的示例演示了对此的需求,因为其图中的图例实际上完全遮盖了多个数据点.
http://matplotlib.sourceforge.net/users/legend_guide.html#legend-of-complex-plots
我希望能够做的是动态扩展图框的大小以适应不断扩大的图形图例.
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(-2*np.pi, 2*np.pi, 0.1)
fig = plt.figure(1)
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x), label='Sine')
ax.plot(x, np.cos(x), label='Cosine')
ax.plot(x, np.arctan(x), label='Inverse tan')
lgd = ax.legend(loc=9, bbox_to_anchor=(0.5,0))
ax.grid('on')
Run Code Online (Sandbox Code Playgroud)
请注意最终标签"逆棕褐色"实际上是如何在图框之外(看起来严重截止 - 而不是出版质量!)

最后,我被告知这是R和LaTeX中的正常行为,所以我有点困惑为什么在python中这么难...有历史原因吗?Matlab在这件事上同样很差吗?
我在pastebin http://pastebin.com/grVjc007上有这个代码的(仅略微)更长版本
我正在使用factorplot(kind="bar")seaborn.
情节很好,除了传说是错位的:右边太多,文字从情节的阴影区域出来.
如何让seaborn将传奇置于其他地方,例如左上角而不是右中角?
我想创建一个时间序列图,使用seaborn.tsplot类似于此示例中的tsplot文档,但图例移到右侧,图中.

基于seaborn的timeseries.py中的 339-340行,看起来seaborn.tsplot目前不允许直接控制图例放置:
if legend:
ax.legend(loc=0, title=legend_name)
Run Code Online (Sandbox Code Playgroud)
是否有matplotlib解决方法?我正在使用seaborn 0.6-dev.
阅读下面的文章,我设法将一个传奇放在外面.
码:
import matplotlib.pyplot as pyplot
x = [0, 1, 2, 3, 4]
y = [xx*xx for xx in x]
fig = pyplot.figure()
ax = fig.add_subplot(111)
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width*0.8, box.height])
ax.plot(x, y)
leg = ax.legend(['abc'], loc = 'center left', bbox_to_anchor = (1.0, 0.5))
#pyplot.show()
fig.savefig('aaa.png', bbox_inches='tight')
Run Code Online (Sandbox Code Playgroud)
pyplot.show()显示正确的情节,外面有一个图例.但是当我将其保存为文件时fig.savefig(),图例会被截断.
一些谷歌搜索显示我作为变通方法添加这样bbox_extra_artists=[leg.legendPatch]或bbox_extra_artists=[leg]至savefig(),但既不工作.
这样做的正确方法是什么?Matplotlib版本为0.99.3.
谢谢.
怎么可能把传说放在情节之外?
import pandas as pd
import matplotlib.pyplot as plt
a = {'Test1': {1: 21867186, 4: 20145576, 10: 18018537},
'Test2': {1: 23256313, 4: 21668216, 10: 19795367}}
d = pd.DataFrame(a).T
#print d
f = plt.figure()
plt.title('Title here!', color='black')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
d.plot(kind='bar', ax=f.gca())
plt.show()
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用matplotlib创建一个带有图例的图表.我可以看到正在创建绘图,但图像边界不允许显示整个图例.
lines = []
ax = plt.subplot(111)
for filename in args:
lines.append(plt.plot(y_axis, x_axis, colors[colorcycle], linestyle='steps-pre', label=filename))
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
Run Code Online (Sandbox Code Playgroud)
这会产生:

我知道bbox_to_anchor关键字和这个帖子,它非常有用地建议如何手动放置图例:
但是,我想在图表中使用我的x轴和y轴的坐标来指定图例位置(在图中),因为我可能需要将图形移动到具有不同轴环境的大图中,每次我这样做时,我都不想手动使用这些坐标.这可能吗?
编辑:这里有一个小例子:
import numpy as n
f, axarr = plt.subplots(2,sharex=True)
axarr[1].set_ylim([0.611,0.675])
axarr[0].set_ylim([0.792,0.856])
axarr[0].plot([0, 0.04, 0.08],n.array([ 0.83333333, 0.82250521,0.81109048]), label='test1')
axarr[0].errorbar([0, 0.04, 0.08],n.array([ 0.8, 0.83, 0.82]),n.array([0.1,0.1,0.01]), label='test2')
axarr[1].plot([0, 0.04, 0.08],n.array([ 0.66666667, 0.64888304, 0.63042428]))
axarr[1].errorbar([0, 0.04, 0.08],n.array([ 0.67, 0.64, 0.62]),n.array([ 0.01, 0.05, 0.1]))
axarr[0].legend(bbox_to_anchor=(0.04, 0.82, 1., .102),labelspacing=0.1, handlelength=0.1, handletextpad=0.1,frameon=False, ncol=4, columnspacing=0.7)
Run Code Online (Sandbox Code Playgroud)
我觉得让我感到困惑的是,传说实际上并没有从0.82开始,实际上对于我的大图(有5个这种类型的子图),我需要使用图例坐标bbox_to_anchor =(0.04,1.15,1.,.010)为了使图例出现在坐标(0.02,0.83)上.但也许我得到别的错了?
我遇到了matplotlib使用关键字loc和自定义图例位置的代码bbox_to_anchor.例如 :
fig.legend([line1, line2], ['series1', 'series2'], bbox_to_anchor=[0.5, 0.5],
loc='center', ncol=2)
Run Code Online (Sandbox Code Playgroud)
我已经看到上面的变化bbox_to_anchor用于之后loc.
我理解使用bbox_to_anchor和loc分开的目的.但是,在同一传奇规范中使用两者有什么好处吗?根据我的理解和用法,在我看来,如果bbox_to_anchor指定,那么loc参数几乎不在乎.
谁能证实这一点?我没有看到任何关于此的文档.
在matplotlib网站的"图例指南" 的"图例位置"部分中,有一个小脚本,其中第9行是plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, ncol=2, mode="expand", borderaxespad=0.).我见过的所有元组bbox_to_anchor都有2个元素,但是这个元素有4个.如果元组通过有4个元素,每个元素意味着什么?
我在pyplot.legend 文档中看到它,它说了一些关于bbox_transform坐标的东西.所以我环顾四周,发现matplotlib.transforms.Bbox了一个static from_bounds(x0, y0, width, height).
我猜测4元组参数的设置基于此from_bounds.我将脚本复制到Spyder,%matplotlib在Ipython控制台中完成,并更改了一些值.这似乎是有道理的,但当我尝试只改变.102类似的东西时0.9,传说并没有改变.我认为元组是基于的from_bounds,我只是不知道为什么改变元组中的最后一个值什么也没做.
我使用matplotlib生成条形图,看起来堆积条形图有一个错误.每个垂直堆栈的总和应为100.但是,对于X-AXIS刻度65,70,75和80,我们得到完全任意的结果,这没有任何意义.我不明白是什么问题.请在下面找到MWE.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
header = ['a','b','c','d']
dataset= [('60.0', '65.0', '70.0', '75.0', '80.0', '85.0', '90.0', '95.0', '100.0', '105.0', '110.0', '115.0', '120.0', '125.0', '130.0', '135.0', '140.0', '145.0', '150.0', '155.0', '160.0', '165.0', '170.0', '175.0', '180.0', '185.0', '190.0', '195.0', '200.0'), (0.0, 25.0, 48.93617021276596, 83.01886792452831, 66.66666666666666, 66.66666666666666, 70.96774193548387, 84.61538461538461, 93.33333333333333, 85.0, 92.85714285714286, 93.75, 95.0, 100.0, 100.0, 100.0, 100.0, 80.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0, 100.0), (0.0, 50.0, 36.17021276595745, 11.320754716981133, 26.666666666666668, 33.33333333333333, 29.03225806451613, …Run Code Online (Sandbox Code Playgroud)