matplotlib 使用值的向量着色双对数图?

7fhtutme  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(122)

我想用matplotlib中的一个数组值来给双对数图着色。这个数组值的形状与所绘制的数据形状相同。我想下面的例子可以很好地说明我的想法。
以下是相同的概念,但使用plt.scatter函数绘制:

y = np.empty([40, 2])
y[:, 0] = np.arange(40)
y[:,1] = y[:,0]**2
color = y[:,1]**3

plt.figure()
plt.scatter(y[:, 0], y[:,1], c=color, cmap='OrRd', norm=mpl.colors.LogNorm())
plt.xscale('log')
plt.yscale('log')
plt.colorbar()

以上代码的输出如下图所示:

但是,如果我使用plt.loglog函数而不是plt.scatter运行相同的代码,则会出现以下错误:

ValueError: array([0.00000000e+00, 1.00000000e+00, 6.40000000e+01, 7.29000000e+02,
       4.09600000e+03, 1.56250000e+04, 4.66560000e+04, 1.17649000e+05,
       2.62144000e+05, 5.31441000e+05, 1.00000000e+06, 1.77156100e+06,
       2.98598400e+06, 4.82680900e+06, 7.52953600e+06, 1.13906250e+07,
       1.67772160e+07, 2.41375690e+07, 3.40122240e+07, 4.70458810e+07,
       6.40000000e+07, 8.57661210e+07, 1.13379904e+08, 1.48035889e+08,
       1.91102976e+08, 2.44140625e+08, 3.08915776e+08, 3.87420489e+08,
       4.81890304e+08, 5.94823321e+08, 7.29000000e+08, 8.87503681e+08,
       1.07374182e+09, 1.29146797e+09, 1.54480442e+09, 1.83826562e+09,
       2.17678234e+09, 2.56572641e+09, 3.01093638e+09, 3.51874376e+09]) is not a valid value for color

我知道这意味着由于某种原因,我们不能使用向量通过plt. loglog对线进行着色。是否有解决方法,以便在双对数图中,沿着线连续更改颜色?
谢谢你!

gab6jxml

gab6jxml1#

这类操作(操作曲线的各个分段)通常使用matplotlib.collections.LineCollection示例来完成(另请参见the examples)。
代码已注解,但如果您需要进一步解释,请在答案下注解,我会得到通知。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.collections import LineCollection
from matplotlib.colors import LogNorm

# Let's draw a parabola
x = np.linspace(1, 2, 101)
y = 2+(1-x)*(2-x)

# How do you build a line collection?
# ImportanceOfBeingErnest's answer is at
# https://stackoverflow.com/a/58880037/2749397
points = np.array([x, y]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
lc = LineCollection(
    segments,
    cmap='plasma', norm=LogNorm(), linewidth=4)

# Now we set the values that are going to be colormapped
# here just the ordinates
lc.set_array(y)

# We want loglog
fig, ax = plt.subplots()
ax.set_xscale('log')
ax.set_yscale('log')

# Let's plot our parabola with zero width, just to trigger the auto-scaling
plt.plot(x, y, lw=0)

# Add the line collection, the colorbar and finally display 
ax.add_collection(lc)
plt.colorbar(lc)
plt.show()

相关问题