我试图在同一个图中显示两个 OpenCV 视频源作为子图,但找不到如何做到这一点。当我尝试使用时plt.imshow(...), plt.show(),窗口甚至不会出现。当我尝试使用 时cv2.imshow(...),它显示两个独立的数字。我真正想要的是子图:(。有什么帮助吗?
这是我到目前为止的代码:
import numpy as np
import cv2
import matplotlib.pyplot as plt
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
while(True):
ret, frame = cap.read()
channels = cv2.split(frame)
frame_merge = cv2.merge(channels)
#~ subplot(211), plt.imshow(frame)
#~ subplot(212), plt.imshow(frame_merged)
cv2.imshow('frame',frame)
cv2.imshow('frame merged', frame_merge)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
更新:理想情况下,输出应该类似于:
有点奇怪,我显然错过了一些东西,但我得到了一些非常奇怪的行为,而且我无法弄清楚我做错了什么。
我有一个带有网格格式子图的图(为了这篇文章,我只说一个 2 × 2 网格)。我想在每个上绘制一些东西并添加一个圆圈。应该很容易,但它并不像我预期的那样。
示例代码1:
import matplotlib.pyplot as plt
x = [ -1.0, -0.5, 0.0, 0.5, 1.0 ]
y = [ 0.7, 0.2, 1.0, 0.0, 0.0 ]
circle = plt.Circle( ( 0, 0 ), 1 )
fig, axes = plt.subplots( 2, 2 )
axes[ 0, 0 ].plot( x, y )
axes[ 1, 1 ].plot( x, y )
axes[ 0, 0 ].add_patch( circle )
axes[ 1, 1 ].add_patch( circle )
plt.show( )
Run Code Online (Sandbox Code Playgroud)
输出1:
示例代码2:
import matplotlib.pyplot as plt
x …Run Code Online (Sandbox Code Playgroud) 使用 matplotlib.pyplot,我有两个图。一种是音频文件的波形。第二个是同一音频的频谱图。我希望波形位于频谱图的正上方(相同的 x 轴,并对齐在一起)。我还想要一个频谱图的颜色条。
问题 - 当我放入颜色条时,它附加到频谱图行,并且波形在颜色条上延伸(即不再与频谱图时间对齐并且比频谱图更宽)。
我想,我已经接近解决方案了,但我只是不太清楚我做错了什么,或者需要改变什么才能让它按照我想要的方式工作。希望有人能指出我正确的方向!
使用以下 python 代码(我尽可能将代码设为 MWE):
import matplotlib
matplotlib.use("TkAgg")
from scipy.io import wavfile
from matplotlib import mlab
from matplotlib import pyplot as plt
import numpy as np
from numpy.lib import stride_tricks
samplerate, data = wavfile.read('FILENAME.wav')
times = np.arange(len(data))/float(samplerate)
plt.close("all")
####
#Waveform
####
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(13.6, 7.68))
plt.subplot(211)
plt.plot(times, data, color='k')
plt.xlabel('time (s)')
plt.xlim(times[0], times[-1])
max_amp = max(abs(np.amin(data)), abs(np.amax(data)))
min_amp = (max_amp * -1) - abs(np.amin(data) - np.amax(data))/50
max_amp = max_amp + …Run Code Online (Sandbox Code Playgroud) 我怎样才能让相同的图例出现在 2 个子图上,并使其扩展到 2 个子图上。有人知道吗,如果我必须单独精确每个子图的 y 标签(如果它是相同的)(该图用于一篇科学论文) ?我知道后一个问题与计算无关,但如果有人知道答案,我将不胜感激。
对于图例的放置,我使用:
ax[0].legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
ncol= 4, mode="expand", borderaxespad=0)
Run Code Online (Sandbox Code Playgroud)
我有一个关于使用 matplotlib 的子图每行共享 y 轴的问题。我有以下脚本作为示例。sharey=True当我在子图函数中使用作为参数时,ax[x, x].set_ylim(n, n)然后它使用我使用的最后一个参数。
import matplotlib.pyplot as plt
fig, ax = plt.subplots(3, 2, figsize=(8, 10), sharey=True, gridspec_kw={'height_ratios': [1, 2, 2]})
ax[0, 0].set_ylim(-1.5, 1.5)
ax[1, 0].set_ylim(-40, 40)
ax[1, 1].set_ylim(-40, 40)
ax[2, 0].set_ylim(-40, 40)
ax[2, 1].set_ylim(-40, 40)
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以让我每行共享 y 轴?
我阅读了使用 GridSpec 自定义子图位置中的说明,并尝试了以下代码并获得了绘图布局:
import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(3, 3)
ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :-1])
ax3 = plt.subplot(gs[1:, -1])
ax4 = plt.subplot(gs[-1, 0])
ax5 = plt.subplot(gs[-1, -2])
Run Code Online (Sandbox Code Playgroud)
我知道这gridspec.GridSpec(3, 3)将给出 3*3 布局,但这意味着什么gs[0, :] gs[1, :-1] gs[1:, -1] gs[-1, 0] gs[-1, -2]?我在网上查找但没有找到详细的解释,我也尝试更改索引但没有找到规律的模式。谁能给我一些解释或者给我一个关于这个的链接?
我希望水平调整子图之间的空间。特别是每两行之间。我可以使用fig.subplots_adjust(hspace=n). 但是是否可以将其应用于每第二行?
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize = (10,10))
plt.style.use('ggplot')
ax.grid(False)
ax1 = plt.subplot2grid((5,2), (0, 0))
ax2 = plt.subplot2grid((5,2), (0, 1))
ax3 = plt.subplot2grid((5,2), (1, 0))
ax4 = plt.subplot2grid((5,2), (1, 1))
ax5 = plt.subplot2grid((5,2), (2, 0))
ax6 = plt.subplot2grid((5,2), (2, 1))
ax7 = plt.subplot2grid((5,2), (3, 0))
ax8 = plt.subplot2grid((5,2), (3, 1))
fig.subplots_adjust(hspace=0.9)
Run Code Online (Sandbox Code Playgroud)
secondHold = np.zeros((96,30))
channel = ['channel' for x in range(96)]
for i in range (96):
BlankBinsx = bins[blankposition,0:30,i]
StimBinsx = bins[NonBlankPositions,0:30,i]
meanx = BlankBinsx.mean(axis=0);
stimmeanx = StimBinsx.mean(axis=0);
for j in range(30):
hold[i][j] = meanx[j];
secondHold[i][j] = stimmeanx[j];
plt.subplots(1, 1, sharex='all', sharey='all')
plt.plot(hold[i], label='stimulus')
plt.plot(secondHold[i], label='Blank Stimulus')
plt.title('Channel x')
plt.xlabel('time (ms)')
plt.ylabel('Avg Spike Rate')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)
我正在通过 for 循环创建 96 个不同的图形,我希望它也标记图形(即,第一个图形是'Channel 1',图形二'Channel 2'等等。我尝试过ax.set_title但无法弄清楚如何使它与字符串和数字。
此外,我希望将图形打印为 6x16 子图,而不是一列中的 96 个图形。
鉴于我有来自此链接的以下代码:
from plotly.subplots import make_subplots
import plotly.graph_objects as go
fig = make_subplots(rows=1, cols=2)
fig.add_trace(
go.Scatter(x=[1, 2, 3], y=[4, 5, 6]),
row=1, col=1
)
fig.add_trace(
go.Scatter(x=[20, 30, 40], y=[50, 60, 70]),
row=1, col=2
)
fig.update_layout(height=600, width=800, title_text="Subplots")
fig.show()
Run Code Online (Sandbox Code Playgroud)
这段代码的问题是,xaxis和yaxis没有任何标签。除此之外,当前代码仅对所有图应用一个标题,但是我想对每个散点图应用不同的标题。
我怎样才能做到这一点?
我想使用 制作一个多图subplot,这样一个或多个特定子图的背景颜色与其他子图不同,如下例所示:

请注意,我对设置子图外部补丁的背景颜色而不是图内部的背景颜色感兴趣(可以使用facecolor='gray')。这是因为我想绘制密度图并且我想将其中的一些与其余的区分开来。
我已经发现等类似的问题本例如其中副区的每行有不同的背景颜色,但我不能够修改代码,以便可在特定副区(比如(1,2)所施加的颜色,(1 ,3), (2,1) 和 (2,2) 如上图所示)。
这是一个示例代码:
import numpy as np
import matplotlib.pyplot as plt
fig, subs = plt.subplots(3,3,figsize=(10,10))
images = []
for i in range(3):
for j in range(3):
data = np.random.rand(20,20)
images.append(subs[i, j].imshow(data))
subs[i, j].label_outer()
plt.show()
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。