我創建了一個腳本來讀取和繪制 .txt 檔案及其內容(數字/值)。每個 .txt 檔案位于不同的檔案夾中。反過來,每個檔案夾代表一個主題,資料源自該主題。
這段代碼作業正常。Python 讀取每個單獨的 .txt。檔案并將 23 個單獨的圖/線繪制成一個圖。Python 在這里使用了一些標準顏色,即每個圖形自動以不同的顏色呈現。
我想做的是以下內容:我想使用 matplotlib 中的特定顏色圖(例如“等離子”),而不是使用由 python 自動分配的標準顏色而不添加任何顏色相關代碼。
問題:無論我使用互聯網上的什么代碼,所有圖形/線條/主題總是收到相同的顏色(例如,等離子顏色圖中的第一種顏色或最后一種顏色)。
如何指定代碼以便每一行都從選擇的顏色圖中獲得一種不同的顏色?
這是我的代碼:
# Initialize
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from matplotlib.pyplot import cm
# Numpy.loadtxt – Loads data from a textfile. Scipy.signal.welch – Creation of the FFT/power-spectrum. f, Pxx_den creates the ideal frequencies/FFT (f, Welch = Power Spectrum or Power Spectral Density)
Subjects = ["Subject1", "Subject2", "Subject3", "Subject4", "Subject5", "Subject7", "Subject8", "Subject9", "Subject10", "Subject11", "Subject12", "Subject13",
"Subject14", "Subject15", "Subject16", "Subject17", "Subject18", "Subject19", "Subject20", "Subject22", "Subject23", "Subject24", "Subject25"]
for Subject in Subjects:
Subject = np.loadtxt("/volumes/SanDisk2/fmri/dataset/processed/extracted_timeseriespython/restingstate/{0}/TimeSeries.SPC.Core_ROI.{0}.txt".format(Subject), comments="#", delimiter=None,
converters=None, skiprows=0, usecols=0, unpack=False, ndmin=0, encoding=None, max_rows=None, like=None)
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")
cmap = plt.get_cmap("inferno")
slicedCM = cmap(np.linspace(0, 1, len(Subjects)))
plt.plot(f, Welch, c=slicedCM[Subjects.index(Subject)])
# Grid labels
plt.title("Power Spectrum for all subjects", fontsize=12, fontweight="bold")
plt.xlabel("Log Frequency [Hz]", fontsize=11, fontweight="bold")
plt.ylabel("Log Power [Hz]", fontsize=11, fontweight="bold")
# Grid dimenions and style
plt.xlim([0.005, 0.2]) # x-axis range
plt.ylim([0, 100]) # y-axis range
plt.xticks(np.arange(0, 0.21, 0.025)) # x ticks range (start, end, step)
plt.yticks(np.arange(0, 101, 10)) # y ticks range (start, end, step)
plt.grid(True) # Show grid
plt.rc("axes", axisbelow=True) # Grid behind figures
plt.rc("grid", linestyle="-", color="black") # Grid look
# Show result
plt.show()
這是生成的螢屏截圖,顯示使用標準顏色而不是所需的等離子顏色圖:

我正在matplotlib3.5.0與MacOSX作為后端。
uj5u.com熱心網友回復:
實作目標的一種方法是切分顏色圖,然后使用其中一種結果顏色繪制每條線。請參閱以下可以在適當位置集成到代碼中的行。
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)])
(前兩行可以放在開頭,您可以用上面建議的第三行代碼替換代碼中的線繪制曲線。)
或者,也許更簡潔的方法是在主回圈中使用以下幾行Subjects:
cmap = plt.get_cmap('inferno')
plt.plot(f, Welch, c=cmap(Subjects.index(Subject)/len(Subjects)))
(我看到你的問題,你正在改變Subject,當你再次將檔案加載到Subject。只需使用另一個變數名,也就是說,data = np.loadtxt...然后f, Welch = signal.welch(data, ....,保持代碼用不同的顏色繪制上面建議的,你不會有任何問題。)
uj5u.com熱心網友回復:

你想給顏色圖實體一個在 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)))
uj5u.com熱心網友回復:
我的 CMasher 具有函式take_cmap_colors()( https://cmasher.readthedocs.io/user/usage.html#taking-colormap-colors ),它是為處理這種情況而撰寫的。只需為它提供一個顏色圖、顏色數量和您想要的可選范圍,它就會回傳一個顏色串列(以 MPL 理解的格式),從提供的顏色圖中統一獲取。
因此,在您的特定情況下,您可以這樣做:
# Import CMasher
import cmasher as cmr
# Obtain colors from a colormap
colors = cmr.take_cmap_colors('inferno', len(Subjects))
# YOUR FOR-LOOP
for Subject, color in zip(Subjects, colors):
Subject = np.loadtxt("/volumes/SanDisk2/fmri/dataset/processed/extracted_timeseriespython/restingstate/{0}/TimeSeries.SPC.Core_ROI.{0}.txt".format(Subject), comments="#", delimiter=None,
converters=None, skiprows=0, usecols=0, unpack=False, ndmin=0, encoding=None, max_rows=None, like=None)
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")
plt.plot(f, Welch, c=color)
您可以為函式提供 MPL 中任何已注冊顏色圖的名稱,或者Colormap如果您使用自定義的非注冊顏色圖,則可以提供一個物件。
還可以查看 CMasher 為您提供的顏色圖(https://cmasher.readthedocs.io/user/introduction.html)。您可能會在那里為您的情節找到更好的候選人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/371888.html
標籤:Python matplotlib 颜色图
上一篇:如何正確設定此優化模型的影片
下一篇:調整等值線圖的繪制值
