python - 散点矩阵在图表上显示太多浮点值

标签 python pandas matplotlib

我正在尝试使用 Python 绘制散点矩阵,但左上角图 y 轴上的刻度有大量不必要的数字。我使用 pandas.plotting 中的 scatter_matrix 函数直接绘制 p​​andas 的图表

另外,我对 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 或直方图,显示该行其余部分的刻度。然后,这需要伪造刻度和标签以适合数据。在此过程中使用了FixedLocatorFixedFormatter。因此,刻度标签的格式直接取自数字的字符串表示形式。

我会在这里提出一个完全不同的设计。也就是说,对角轴应保留为空,而使用双轴来显示直方图或 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/

相关文章:

python - 捕获表达式中值为 "or"的 None 值

python - 在 pandas 中使用元组作为索引键时如何返回 "explicitly specify the categories order by passing in a categories argument"?

python - 如何在 pct_change 计算中对 pandas DataFrame 中的多列进行分组

python - 在Django home中添加动态生成的matplotlib图片

python - 如何在 NetworkX 中为 MultiGraph 绘制边标签?

python - 数组相等但视觉上不一样

c# - 将不同的参数传递给 C# 动态库

python - Django cursor.execute(QUERY) 比在 postgres 数据库中运行查询慢得多

python - 打印一行数字,然后换行继续计数

python - 使用不等式条件从 pandas 数据帧中查找值到另一个数据帧中