python - 在 matplotlib 中转换整个轴(或散点图)

标签 python matplotlib transform

我正在使用以下代码绘制一些数据的均值和方差的变化

import matplotlib.pyplot as pyplot
import numpy

vis_mv(data, ax = None):
    if ax is None: ax = pyplot.gca()
    cmap = pyplot.get_cmap()
    colors = cmap(numpy.linspace(0, 1, len(data)))

    xs = numpy.arange(len(data)) + 1
    means = numpy.array([ numpy.mean(x) for x in data ])
    varis = numpy.array([ numpy.var(x) for x in data ])
    vlim = max(1, numpy.amax(varis))

    # variance
    ax.imshow([[0.,1.],[0.,1.]],
        cmap = cmap, interpolation = 'bicubic',
        extent = (1, len(data), -vlim, vlim), aspect = 'auto'
    )
    ax.fill_between(xs, -vlim, -varis, color = 'white')
    ax.fill_between(xs, varis, vlim, color = 'white')

    # mean
    ax.plot(xs, means, color = 'white', zorder = 1)
    ax.scatter(xs, means, color = colors, edgecolor = 'white', zorder = 2)

    return ax

这工作得很好: enter image description here 但现在我希望能够以垂直方式使用这种可视化,作为某种高级颜色条,类似于另一个情节。我希望可以旋转整个轴及其所有内容, 但我只能找到 this question ,这也没有真正可靠的答案。因此,我尝试自己做如下:

from matplotlib.transforms import Affine2D

ax = vis_mv()
r = Affine2D().rotate_deg(90) + ax.transData

for x in ax.images + ax.lines + ax.collections:
    x.set_transform(r)

old = ax.axis()
ax.axis(old[2:4] + old[0:2])

几乎 达到了目的(请注意过去位于白线上的散点如何被放大并且没有按预期旋转)。 enter image description here 不幸的是,保存 scattering 结果的 PathCollection 没有按预期运行。在尝试了一些东西之后,我发现 scatter 有某种偏移变换,这似乎与其他集合中的正则变换是等价的。

x = numpy.arange(5)
ax = pyplot.gca()
p0, = ax.plot(x)
p1 = ax.scatter(x,x)

ax.transData == p0.get_transform()           # True
ax.transData == p1.get_offset_transform()    # True

似乎我可能想更改散点图的偏移变换,但我没有设法找到任何允许我更改 PathCollection 上的变换的方法。而且,做我真正想做的事情会变得更加不便。

有人知道是否可以更改偏移变换吗?

提前致谢

最佳答案

不幸的是,PathCollection 没有 .set_offset_transform() 方法,但可以访问私有(private) _transOffset 属性并设置旋转变换

import matplotlib.pyplot as plt
from matplotlib.transforms import Affine2D
from matplotlib.collections import PathCollection
import numpy as np; np.random.seed(3)

def vis_mv(data, ax = None):
    if ax is None: ax = plt.gca()
    cmap = plt.get_cmap()
    colors = cmap(np.linspace(0, 1, len(data)))

    xs = np.arange(len(data)) + 1
    means = np.array([ np.mean(x) for x in data ])
    varis = np.array([ np.var(x) for x in data ])
    vlim = max(1, np.amax(varis))

    # variance
    ax.imshow([[0.,1.],[0.,1.]],
        cmap = cmap, interpolation = 'bicubic',
        extent = (1, len(data), -vlim, vlim), aspect = 'auto'  )
    ax.fill_between(xs, -vlim, -varis, color = 'white')
    ax.fill_between(xs, varis, vlim, color = 'white')

    # mean
    ax.plot(xs, means, color = 'white', zorder = 1)
    ax.scatter(xs, means, color = colors, edgecolor = 'white', zorder = 2)

    return ax

data = np.random.normal(size=(9, 9))
ax  = vis_mv(data)


r = Affine2D().rotate_deg(90)

for x in ax.images + ax.lines + ax.collections:
    trans = x.get_transform()
    x.set_transform(r+trans)
    if isinstance(x, PathCollection):
        transoff = x.get_offset_transform()
        x._transOffset = r+transoff

old = ax.axis()
ax.axis(old[2:4] + old[0:2])


plt.show()

enter image description here

关于python - 在 matplotlib 中转换整个轴(或散点图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43892973/

相关文章:

css - 在悬停时旋转父项而不是子项

python - 删除字符串的多个索引

numpy - 将方程的 txt 文件格式化为相同格式,然后在 Python 中操作它们以进行线性代数计算

python - 当我 'run all' 时,Matplotlib 图没有显示在 Jupyter Notebook 上

python - Jupyter笔记本: Output image in previous line

html - CSS 变换中的奇怪错误 - 1 像素加上一些透明度

python - 将 xml 文件转换为字典

python - 线性回归 - 均方误差太大

python - 如何调整代码以使用回溯算法解决组合问题

haskell - 你能根据 `Comonads` 定义 `Monads` 吗?