Mac 上运行 OS 11.6.1 的 Python 3.9。我的应用程序涉及将绘图放置在根窗口内的框架上,并且我正在努力让绘图占据窗口的较大部分。我以为rcParams
会matplotlib.pyplot
解决这个问题,但我一定忽略了一些事情。
这是我到目前为止所拥有的:
import numpy as np
from tkinter import Tk,Frame,TOP,BOTH
import matplotlib
from matplotlib import pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
plt.rcParams["figure.figsize"] = [18,10]
root=Tk()
root.wm_title("Root Window")
root.geometry('1500x1000')
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)
fig, ax = plt.subplots()
ax.plot(x, y)
canvas_frame=Frame(root) # also tried adjusting size of frame but that didn't help
canvas_frame.pack(side=TOP,expand=True)
canvas = FigureCanvasTkAgg(fig, master=canvas_frame)
canvas.draw()
canvas.get_tk_widget().pack(side=TOP,fill=BOTH,expand=True)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
对于我的实际应用程序,我需要canvas
有一个框架作为其父级,而不是简单地,这就是上面介绍的 …
我已经使用 Python 的 MNE 包加载了一些脑电图数据。该数据具有从 10-20 个剪辑中获得的 46 个记录通道,但我们已经识别出许多死通道,并且只想关注其余通道。
我可以删除频道,但我不知道如何绘制更新的蒙太奇。
首先,我加载 edf 文件,制作副本并删除所需的通道:
import mne as mn
raw = mn.io.read_raw_edf("patient_001.edf",preload=True)
raw_temp=raw.copy()
raw_temp.drop_channels(['E', 'LIO', 'RIO', 'X1', 'X2',
'X3','X4''X5', 'X6', 'X7', 'X8', 'X9', 'X10', 'X11', 'O2%', 'HR',
'DC03','DC04', 'EEG Mark1', 'EEG Mark2', 'BP1', 'BP2','STI 014'])
Run Code Online (Sandbox Code Playgroud)
我检查了一下,频道已被删除。我现在想做的是仅使用剩余的 23 个通道绘制更新的蒙太奇:
raw_temp.info["ch_names"]
Run Code Online (Sandbox Code Playgroud)
['Fp1'、'Fp2'、'F3'、'F4'、'C3'、'C4'、'P3'、'P4'、'O1'、'O2'、'F7'、'F8'、' T7'、'T8'、'P7'、'P8'、'Fz'、'Cz'、'Pz'、'A1'、'A2'、'T1'、'T2']
根据我对通道布局的极其有限的了解,我理解字母代表位置,数字代表半球,例如F4表示额叶,右侧。
以下打印 10-20 93 通道布局的剪辑:
montage = mn.channels.read_montage("standard_1020")
raw_temp.set_montage(montage)
montage.plot()
Run Code Online (Sandbox Code Playgroud)
其他蒙太奇选项列于
https://github.com/mne-tools/mne-python/blob/master/mne/channels/montage.py
但我没有看到 46 通道选项。
有没有办法以某种方式为我的 23 个频道绘制蒙太奇?
我正在 networkx 中绘制一个无向加权图,并希望用相应的权重标记每个边。我可以做到这一点,但我在四舍五入边缘标签值时遇到问题,以便生成的图表不会太混乱。
我们假设我已经创建了邻接矩阵 A,并且 labels_dict 是一个字典,其值是每个节点的文本标签,例如“T8-P8”。
import networkx as nx
G=nx.from_numpy_matrix(A)
pos=nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos,nodelist=[j for j in
range(0,len(A))],node_color='gray',node_size=1000,ax=None,alpha=0.8)
nx.draw_networkx_labels(G,pos,labels_dict,font_size=17)
nx.draw_networkx_edges(G,pos,width=1.0,alpha=0.5)
# below I attempt to round off the edge label values to 2 decimal places using numpy's "around" function.
edge_labels=dict([((u,v,),np.around(d['weight'],2))
for u,v,d in G.edges(data=True)])
nx.draw_networkx_edge_labels(G,pos,edge_labels=edge_labels)
ax=plt
ax.axis('off')
fig = ax.gcf()
plt.show()
Run Code Online (Sandbox Code Playgroud)
生成的图表如下所示,显示了边缘标签如何尚未四舍五入:
我有一个方阵列表 M[t],其中 t 的范围从 0 到 N,我希望使用 plotly.express 创建一个动画热图。每行/列中的条目对应一个列表,a=['a1','a2',...'aN']
关于动画的情节文档相当稀少,只关注散点图和条形图
https://plotly.com/python/animations/
一个与我类似的问题发布在
但是,用户在 Jupyter 笔记本中工作。我只是在 Mac (OS 10.15.4) 上使用带有 IDLE 的 Python 3.7
我知道如何使用 matplotlib 或 seaborn 创建基本动画,但我喜欢 plotly express 附带的内置开始/停止按钮。这是我使用的一种方法,但我确信使用 matplotlib.animation 有更有效的方法:
import numpy as np
import matplotlib.pyplot as plt
#50 matrices, each of size 4-by-4.
N = 50
M = np.random.random((50, 4,4))
#Desired labels for heatmap--not sure where to put.
labels=['a','b','c','d']
fig, ax = plt.subplots()
for t in range(50):
ax.cla()
ax.imshow(M[t])
ax.set_title("frame {}".format(t))
plt.pause(0.1)
Run Code Online (Sandbox Code Playgroud) 我正在使用滑块来显示热图动画,并希望重新标记滑块上出现的刻度线。
我的动画中有 50 帧,热图中的每个矩阵的尺寸为 7×7,其中七行/列对应于列表,labels=['A','B','C','D '、'D'、'F'、'G']。此外,在我的应用程序中,每个帧对应于 5 秒的窗口,因此,例如,第 3 帧对应于 15 秒。这是到目前为止我的简单示例,我模仿https://plotly.com/python/sliders/上的文档
import numpy as np
import plotly.graph_objs as go
N = 50
M = np.random.random((N, 7, 7))
labels=['A','B','C','D','D','F','G']
window_length=5
fig = go.Figure()
for step in range(N):
fig.add_trace(
go.Heatmap(x=labels,y=labels,z=M[step]))
fig.data[1].visible = True
# Create and add slider
steps = []
for i in range(len(fig.data)):
step = dict(
method="update",
args=[{"visible": [False] * len(fig.data)},
{"title": "Time: " + str(window_length*i)+' sec'}],)
step["args"][0]["visible"][i] = True # Toggle i'th trace to "visible"
steps.append(step)
sliders …
Run Code Online (Sandbox Code Playgroud) 运行 OS 11.6.1 的 Mac 上的 Python 3.10
我从我的机器上卸载了 Python 3.9 并升级到版本 3.10。安装 pandas、scipy 等标准软件包没有问题。但是 epycom 等一个软件包需要 numba。
当我输入时pip3 install numba
,我收到下面带有关键字的冗长错误消息FileNotFoundError: [Errno 2] No such file or directory: 'llvm-config'
想知道我是否应该卸载 3.10 并返回到 3.9?
Collecting numba
Using cached numba-0.51.2.tar.gz (2.1 MB)
Preparing metadata (setup.py) ... done
Collecting llvmlite<0.35,>=0.34.0.dev0
Using cached llvmlite-0.34.0.tar.gz (107 kB)
Preparing metadata (setup.py) ... done
Requirement already satisfied: numpy>=1.15 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from numba) (1.22.0)
Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from numba) (58.1.0)
Using legacy …
Run Code Online (Sandbox Code Playgroud) 我开始学习更多关于 plotly 和 pandas 的知识,并有一个多变量时间序列,我希望使用 plotly.express 功能进行绘制和交互。我还希望我的绘图具有水平滚动条,以便初始绘图用于预先指定的初始时间间隔。这是我的示例,涉及三个时间序列以及 10 万个时间点:
import plotly.express as px
import numpy as np
import pandas as pd
np.random.seed(123)
e = np.random.randn(100000,3)
df=pd.DataFrame(e, columns=['a','b','c'])
df['x'] = df.index
df_melt = pd.melt(df, id_vars="x", value_vars=df.columns[:-1])
fig=px.line(df_melt, x="x", y="value",color="variable")
fig.show()
Run Code Online (Sandbox Code Playgroud)
(对于我的最终目的,时间序列会更大——在 90 万多个时间点中可能有 40 到 70 个时间序列。)
这将创建一个图形,我可以使用 plotly.express 功能与之交互,例如缩放、平移、矩形选择等。
有没有一种方法可以增加它,以便初始图仅显示前 500 个时间点,并且滚动条允许我调查随着时间的增加会发生什么?
在空闲时使用 Mac OS 10.15.4 和 Python 3.7。我希望在 IDLE 中而不是在 Jupyter notebook 环境中创建它。
我有一个时间序列的数据框图以及一个数值列表,我想在其中绘制垂直线。该图是使用 cufflinks 包创建的交互式图。这是一个包含 1000 个时间值的三个时间序列的示例,我想在 500 和 800 处绘制垂直线。我使用“axvlinee”的尝试是基于我在类似帖子中看到的建议:
import numpy as np
import pandas as pd
import cufflinks
np.random.seed(123)
X = np.random.randn(1000,3)
df=pd.DataFrame(X, columns=['a','b','c'])
fig=df.iplot(asFigure=True,xTitle='time',yTitle='values',title='Time Series Plot')
fig.axvline([500,800], linewidth=5,color="black", linestyle="--")
fig.show()
Run Code Online (Sandbox Code Playgroud)
错误消息指出“Figure”对象没有属性“axvline”。
我不确定这条消息是由于我对基本图缺乏了解还是源于使用 igraph 的限制。