我使用pandas.tools.plotting.scatter_matrix()来获取直方图和散点图的矩阵。
xlim
如果它是散点图,我想迭代每个Axes实例并更改其ylim
和lim_range = (0, recent_grads[['Women', 'Men']].max().max())
@np.vectorize
def set_lims(ax):
# check if ax is a scatter plot
ax.set_xlim((lim_range))
ax.set_ylim((lim_range))
。
.jsx
有没有办法获得Axes的情节类型?在这种情况下,我知道散点图在索引1和2中,但我想避免检查索引。
答案 0 :(得分:1)
没有 Axes 的情节类型。轴可以在其中具有任意图,例如您可以在同一轴上绘制图像,散点图和等高线图。
你可以检查轴内是否有一个集合,对于一个scatter_matrix图,这意味着它是一个散点图,
import matplotlib.pyplot as plt
import pandas as pd
from pandas.plotting import scatter_matrix
import numpy as np
df = pd.DataFrame(np.random.randn(1000, 4), columns=['a', 'b', 'c', 'd'])
axes = scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal='hist')
lim_range = (-7, 7)
for ax in axes.flat:
if len(ax.collections) > 0:
ax.set_xlim(lim_range)
ax.set_ylim(lim_range)
plt.show()
这样做的缺点是第一个y轴和最后一个x轴将保持不变,因为它们不包含散点图。 因此,你需要改变所有绘图的xticks(只是把它放在检查之外。第一个y轴的yticks会更复杂。你需要从其他轴上取下它们并重新调整刻度。
import matplotlib.pyplot as plt
import pandas as pd
from pandas.plotting import scatter_matrix
import numpy as np
df = pd.DataFrame(np.random.randn(1000, 4), columns=['a', 'b', 'c', 'd'])
axes = scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal='hist')
lim_range = (-7, 7)
for ax in axes.flat:
ax.set_xlim(lim_range)
if len(ax.collections) > 0:
ax.set_ylim(lim_range)
lim1 = axes[0][1].get_xlim()
locs = axes[0][1].yaxis.get_majorticklocs()
locs = locs[(lim1[0] <= locs) & (locs <= lim1[1])]
adj = (locs - lim1[0]) / (lim1[1] - lim1[0])
lim0 = axes[0][0].get_ylim()
adj = adj * (lim0[1] - lim0[0]) + lim0[0]
axes[0][0].yaxis.set_ticks(adj)
if np.all(locs == locs.astype(int)):
# if all ticks are int
locs = locs.astype(int)
axes[0][0].yaxis.set_ticklabels(locs)
plt.show()