我正在尝试使用 Python 绘制散点矩阵,但左上角图 y 轴上的刻度有大量不必要的数字。我使用 pandas.plotting 中的 scatter_matrix 函数直接绘制 pandas 的图表
另外,我对 Python 还很陌生,如果这是一个愚蠢的问题,我很抱歉,但我只是找不到适合我需求的正确答案。
我尝试使用 yaxis.set_major_formatter 使用不同的轴格式化选项(不确定这是否不起作用,因为我是从 pandas 进行绘图,但无论如何都不会产生任何结果),pandas.set_option 来自定义显示。
from pandas.plotting import scatter_matrix
scatter_matrix(df, alpha=0.3, figsize=(9,9), diagonal='kde')
df: Tesla Ret Ford Ret GM Ret
Date
2012-01-03 NaN NaN NaN
2012-01-04 -0.013177 0.015274 0.004751
2012-01-05 -0.021292 0.025664 0.048227
2012-01-06 -0.008481 0.010354 0.033829
2012-01-09 0.013388 0.007686 -0.003490
2012-01-10 0.013578 0.000000 0.017513
2012-01-11 0.022085 0.022881 0.052926
2012-01-12 0.000708 0.005800 0.008173
2012-01-13 -0.193274 -0.008237 -0.015403
2012-01-17 0.167179 -0.001661 -0.003705
...
我尝试过使用:
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.2f}'))
和 ax.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))
导入各自的模块后,无济于事。
图可用here
图中的其他所有内容都应如此,只是左上角图的 y 轴。我希望它像图中的其余部分一样显示一到两个小数点值。
我非常感谢任何可以解决我的问题的帮助。
谢谢。
最佳答案
pandas.scatter_matrix
遭遇了不幸的设计选择。也就是说,它在轴的对角线上绘制 kde 或直方图,显示该行其余部分的刻度。然后,这需要伪造刻度和标签以适合数据。在此过程中使用了FixedLocator
和FixedFormatter
。因此,刻度标签的格式直接取自数字的字符串表示形式。
我会在这里提出一个完全不同的设计。也就是说,对角轴应保留为空,而使用双轴来显示直方图或 kde 曲线。因此,问题中的问题不会发生。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def scatter_matrix(df, axes=None, **kw):
n = df.columns.size
diagonal = kw.pop("diagonal", "hist")
if not axes:
fig, axes = plt.subplots(n,n, figsize=kw.pop("figsize", None),
squeeze=False, sharex="col", sharey="row")
else:
flax = axes.flatten()
fig = flax[0].figure
assert len(flax) == n*n
# no gaps between subplots
fig.subplots_adjust(wspace=0, hspace=0)
hist_kwds = kw.pop("hist_kwds", {})
density_kwds = kw.pop("density_kwds", {})
import itertools
p = itertools.permutations(df.columns, r=2)
n = itertools.permutations(np.arange(len(df.columns)), r=2)
for (i,j), (y,x) in zip(n,p):
axes[i,j].scatter(df[x].values, df[y].values, **kw)
axes[i,j].tick_params(left=False, labelleft=False,
bottom=False, labelbottom=False)
diagaxes = []
for i, c in enumerate(df.columns):
ax = axes[i,i].twinx()
diagaxes.append(ax)
if diagonal == 'hist':
ax.hist(df[c].values, **hist_kwds)
elif diagonal in ('kde', 'density'):
from scipy.stats import gaussian_kde
y = df[c].values
gkde = gaussian_kde(y)
ind = np.linspace(y.min(), y.max(), 1000)
ax.plot(ind, gkde.evaluate(ind), **density_kwds)
if i!= 0:
diagaxes[0].get_shared_y_axes().join(diagaxes[0], ax)
ax.axis("off")
for i,c in enumerate(df.columns):
axes[i,i].tick_params(left=False, labelleft=False,
bottom=False, labelbottom=False)
axes[i,0].set_ylabel(c)
axes[-1,i].set_xlabel(c)
axes[i,0].tick_params(left=True, labelleft=True)
axes[-1,i].tick_params(bottom=True, labelbottom=True)
return axes, diagaxes
df = pd.DataFrame(np.random.randn(1000, 4), columns=['A','B','C','D'])
axes,diagaxes = scatter_matrix(df, diagonal='kde', alpha=0.5)
plt.show()
关于python - 散点矩阵在图表上显示太多浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54712340/