plt.margins
非常适合自动缩放包含int或float值形式的数据的轴,如Add margin when plots run against the edge of the graph中所述。但是,在绘制其他值时似乎不起作用,例如字符串标签或pandas数据帧索引:
df = pd.DataFrame([0,3,2,6])
ax = df.plot(marker='o', ls='')
ax.margins(0.05)
仅重新调整y轴,而不是x轴自然地,仍然存在x范围,并使用ax.set_xlim()
手动将其设置为合理值,显示上图中截断的数据点:
df = pd.DataFrame([0,3,2,6])
ax = df.plot(marker='o', ls='')
ax.margins(0.05)
ax.set_xlim(-0.1, 3.1)
是否可以使用字符串标签或pandas数据框索引自动缩放轴?如果是这样,我该怎么做呢?
答案 0 :(得分:0)
您知道x轴的比例,0
与数据框的长度减去1
。
ax.set_xlim(-0.1, len(df) - 0.9)
是一个合适的“autoscale
”功能。
import pandas as pd
import matplotlib.pyplot as plt
import random
df = pd.DataFrame([random.randrange(1, 10) for i in range(random.randrange(5, 15))])
ax = df.plot(marker='o', ls='')
ax.margins(0.05)
ax.set_xlim(-0.1, len(df) - 0.9)
plt.show()
答案 1 :(得分:0)
您可以编写自己的autoscale()
函数。
import matplotlib.pyplot as plt
import pandas as pd
def automargin(ax=None, marginx=0.1, marginy=0.1, relative=False):
if ax == None:
ax=plt.gca()
xlim=ax.get_xlim()
ylim = ax.get_ylim()
if relative:
dx = xlim[1] - xlim[0]; dy = ylim[1] - ylim[0]
ax.set_xlim([xlim[0]-dx*marginx, xlim[1]+dx*marginx])
ax.set_ylim([ylim[0]-dy*marginy, ylim[1]+dy*marginy])
else:
ax.set_xlim([xlim[0]-marginx, xlim[1]+marginx])
ax.set_ylim([ylim[0]-marginy, ylim[1]+marginy])
df = pd.DataFrame({"x": [0,1,2,3], "y" : [9,4,7,5]})
ax = df.plot(marker='o', ls='')
#Try some of the following:
automargin()
automargin(ax)
automargin(ax, relative=True)
automargin(ax, marginy=0.5)
automargin(ax, marginx=1, marginy=0.5)
automargin(ax, marginx=0.05, marginy=0.05, relative=True)
plt.show()