Phi*_*ipp 5 python matplotlib colormap
我创建了一个读取并绘制 .txt 文件及其内容(数字/值)的脚本。每个 .txt 文件位于不同的文件夹中。每个文件夹又代表数据来源的一个主题。
\n这段代码工作正常。Python 读取每个 .txt。文件并将 23 个单独的图形/线条绘制成一个图。Python在这里使用一些标准颜色,即每个图形自动以不同的颜色呈现。
\n我想做的是:我不想使用 python 自动分配的标准颜色而不添加任何颜色相关代码,而是想使用 matplotlib 中的特定颜色图(例如“plasma”)。
\n问题:无论我使用互联网上的什么代码,所有图形/线条/主题总是收到相同的颜色(例如等离子颜色图中的第一个颜色或最后一个颜色)。
\n如何指定代码,以便每行从所选颜色图中获得一种不同的颜色?
\n这是我的代码:
\n# Initialize\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom scipy import signal\nfrom matplotlib.pyplot import cm\n\n# Numpy.loadtxt \xe2\x80\x93 Loads data from a textfile. Scipy.signal.welch \xe2\x80\x93 Creation of the FFT/power-spectrum. f, Pxx_den creates the ideal frequencies/FFT (f, Welch = Power Spectrum or Power Spectral Density)\nSubjects = ["Subject1", "Subject2", "Subject3", "Subject4", "Subject5", "Subject7", "Subject8", "Subject9", "Subject10", "Subject11", "Subject12", "Subject13",\n "Subject14", "Subject15", "Subject16", "Subject17", "Subject18", "Subject19", "Subject20", "Subject22", "Subject23", "Subject24", "Subject25"]\n\nfor Subject in Subjects:\n\n Subject = np.loadtxt("/volumes/SanDisk2/fmri/dataset/processed/extracted_timeseriespython/restingstate/{0}/TimeSeries.SPC.Core_ROI.{0}.txt".format(Subject), comments="#", delimiter=None,\n converters=None, skiprows=0, usecols=0, unpack=False, ndmin=0, encoding=None, max_rows=None, like=None)\n\n f, Welch = signal.welch(Subject, fs=1.0, window="hann", nperseg=None, noverlap=None, nfft=1024, detrend="constant", return_onesided=True, scaling="density", axis=-1, average="mean")\n\n cmap = plt.get_cmap("inferno")\n slicedCM = cmap(np.linspace(0, 1, len(Subjects)))\n\n plt.plot(f, Welch, c=slicedCM[Subjects.index(Subject)]) \n \n\n# Grid labels\nplt.title("Power Spectrum for all subjects", fontsize=12, fontweight="bold")\nplt.xlabel("Log Frequency [Hz]", fontsize=11, fontweight="bold")\nplt.ylabel("Log Power [Hz]", fontsize=11, fontweight="bold")\n\n# Grid dimenions and style\nplt.xlim([0.005, 0.2]) # x-axis range\nplt.ylim([0, 100]) # y-axis range\n\nplt.xticks(np.arange(0, 0.21, 0.025)) # x ticks range (start, end, step)\nplt.yticks(np.arange(0, 101, 10)) # y ticks range (start, end, step)\n\nplt.grid(True) # Show grid\nplt.rc("axes", axisbelow=True) # Grid behind figures\nplt.rc("grid", linestyle="-", color="black") # Grid look\n\n# Show result\nplt.show()\nRun Code Online (Sandbox Code Playgroud)\n这是生成的屏幕截图,显示使用标准颜色而不是所需的等离子颜色图:
\n\n我正在运行 matplotlib3.5.0作为MacOSX后端。
您想要为颜色图实例提供一个在 0 和 1 之间变化的参数,这需要最少的规划,例如,
x = np.linspace(0,355/113, 101)
p = plt.get_cmap('plasma')
n = 23
for i in range(n):
plt.plot(x, np.sin(x-i/2/n), color=p(i/(n-1)))
Run Code Online (Sandbox Code Playgroud)
实现目标的一种方法是分割颜色图,然后用其中一种结果颜色绘制每条线。请参阅下面的行,这些行可以集成到代码中的适当位置。
import numpy as np
import matplotlib.pyplot as plt
# 1. Choose your desired colormap
cmap = plt.get_cmap('plasma')
# 2. Segmenting the whole range (from 0 to 1) of the color map into multiple segments
slicedCM = cmap(np.linspace(0, 1, len(Subjects)))
# 3. Color the i-th line with the i-th color, i.e. slicedCM[i]
plt.plot(f, Welch, c=slicedCM[Subjects.index(Subject)])
Run Code Online (Sandbox Code Playgroud)
(前两行可以放在开头,您可以用上面建议的第三行代码替换代码中绘制曲线的线。)
或者,也许更简洁的方法是在主循环中使用以下几行Subjects:
cmap = plt.get_cmap('inferno')
plt.plot(f, Welch, c=cmap(Subjects.index(Subject)/len(Subjects)))
Run Code Online (Sandbox Code Playgroud)
Subject(我在你的问题中看到,当你再次将文件加载到 中时,你正在更改Subject。只需使用另一个变量名称,例如,data = np.loadtxt...然后f, Welch = signal.welch(data, ....。按照上面的建议保留用于使用不同颜色进行绘图的代码,你不会有任何问题。)