我正在尝试创建一个由2x2网格组成的图形,其中每个象限中有2个垂直堆叠的子图(即2x1网格).但我似乎无法弄清楚如何实现这一目标.
我得到的最接近的是使用gridspec和一些丑陋的代码(见下文),但是因为gridspec.update(hspace=X)改变了所有子图的间距,我仍然不是我想要的.
理想情况下,我想要的是,使用下面的图片作为示例,减少每个象限内的子图之间的间距,同时增加顶部和底部象限之间的垂直间距(即1-3和2-4之间).
有没有办法做到这一点(使用或不使用gridspec)?我最初想象的是生成每个子子图网格(即每个2x1网格)并将它们插入更大的2x2子图网格中,但我还没想出如何将子图添加到子图中,如果有偶数的话一种方式.
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(4,2)
gs.update(hspace=0.4)
for i in range(2):
for j in range(4):
ax = plt.subplot(gs[j,i])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tick_params(which='both', top='off', right='off')
if j % 2 == 0:
ax.set_title(str(i+j+1))
ax.plot([1,2,3], [1,2,3])
ax.spines['bottom'].set_visible(False)
ax.get_xaxis().set_visible(False)
else:
ax.plot([1,2,3], [3,2,1])
Run Code Online (Sandbox Code Playgroud) 我遇到的事情几乎肯定是我自己的一个愚蠢的错误,但我似乎无法弄清楚发生了什么.
基本上,我有一系列日期作为格式的字符串"%d-%b-%y",例如26-Sep-05.当我将它们转换为日期时,这一年有时是正确的,但有时它不是.
例如:
dates = ['26-Sep-05', '26-Sep-05', '15-Jun-70', '5-Dec-94', '9-Jan-61', '8-Feb-55']
pd.to_datetime(dates, format="%d-%b-%y")
DatetimeIndex(['2005-09-26', '2005-09-26', '1970-06-15', '1994-12-05',
'2061-01-09', '2055-02-08'],
dtype='datetime64[ns]', freq=None)
Run Code Online (Sandbox Code Playgroud)
最后两个条目,这些年份以2061年和2055年的形式返回,是错误的.但这适用于15-Jun-70入口.这里发生了什么?
我正在尝试编写一个在其中嵌入matplotlib图的PyQt5应用程序.但是,我有一个令人抓狂的时间,如果我安装matplotlib PyQt5由于PyQt4的干扰而中断.这可以在以下错误中看到:
In [2]: from PyQt5 import QtCore, QtGui, QtWidgets
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-2-43848d5bd21e> in <module>()
----> 1 from PyQt5 import QtCore, QtGui, QtWidgets
RuntimeError: the PyQt5.QtCore and PyQt4.QtCore modules both wrap the QObject class
Run Code Online (Sandbox Code Playgroud)
如果我删除PyQt4(并重新安装PyQt5,因为删除PyQt4删除了sip)然后我有这个问题:
In [1]: import matplotlib.backends.backend_qt5agg
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-6d2c21e1d629> in <module>()
----> 1 import matplotlib.backends.backend_qt5agg
C:\Anaconda3\lib\site-packages\matplotlib\backends\backend_qt5agg.py in <module>()
16
17 from .backend_agg import FigureCanvasAgg
---> 18 from .backend_qt5 import QtCore
19 from .backend_qt5 import QtGui
20 from …Run Code Online (Sandbox Code Playgroud) 我正在构建一个简单的应用程序来打开一个数据文件夹并绘制该数据。导入数据更新一个 QTreeWidget,显示哪些信号可用于绘制。前任:

使用以下方法导入数据后填充 QTreeWidget:
def update_treeWidget(self):
headers = self.df['voltage recording'].columns[1:]
sweeps = self.df['voltage recording'].index.levels[0]
for header in headers:
parent_item = QtWidgets.QTreeWidgetItem(self.treeWidget)
parent_item.setCheckState(0, QtCore.Qt.Unchecked)
parent_item.setText(0, header)
for sweep in sweeps:
child_item = QtWidgets.QTreeWidgetItem(parent_item)
child_item.setCheckState(0, QtCore.Qt.Unchecked)
child_item.setText(0, sweep)
Run Code Online (Sandbox Code Playgroud)
但是,我不清楚我将如何检查树中任何项目的已检查状态。
所以我的两个问题是:
我将如何引用该树的任何部分来检查它的检查状态(父级或父级的各个子级)
有没有办法简单地返回所有选中的框的列表?如果我能找出问题 1 的答案,我显然可以创建一个函数,每次选中一个框时,它都会添加到列表中(如果未选中,则从该列表中删除)。但由于这里的目标只是绘制所有选中的信号,对我来说最直接的事情(无论如何在逻辑上)是点击“绘制”按钮后,界面首先检查哪些信号框被选中,然后绘制这些信号。
在所有示例中,我似乎都明确声明了树项(即 item_1、item_2),因此引用它们很简单。但是,由于我如何填充树,我不明白如何做到这一点。
如果这是首先填充树的不正确方法,请告诉我和/或指出更正确方法的方向。
谢谢
编辑:
这非常类似于: PyQT QTreeWidget iterating
这就是我的答案所依据的。
我有一个用PyQt4构建的小应用程序,我试图用cx_freeze冻结,但是我遇到了cx_freeze的问题,包括我自己的应用程序工作所需的模块.
我有两个在我的应用程序中导入的模块,这些模块位于应用程序所在的文件夹上方.即:
申请路径:
Python的\ DataViewer的-PyQt4的\ DataViewer.py
其他模块:
Python\My Analysis Packages\Ephystools
Python\My Analysis Packages\PrairieAnalysis
在我的应用程序中,我使用(如果它们不在我的python路径中)导入这些
sys.path.append(os.path.abspath('../My Analysis Packages'))
Run Code Online (Sandbox Code Playgroud)
我尝试在setup.py文件中的'includes'和'packages'中包含PrairieAnalysis和EphysTools.我也试过包括"我的分析包".我也试过提供这些路径.
它们都包含init .py文件,因为实际的应用程序能够很好地导入它们.
如果我将PrairieAnalysis和/或EphysTools放在'includes'列表中,那么setup.py build会返回一个ImportError:
File "C:\Anaconda3\lib\site-packages\cx_Freeze\finder.py", line 386, in _ImportModule
raise ImportError("No module named %r" % name)
ImportError: No module named 'PrairieAnalysis'
Run Code Online (Sandbox Code Playgroud)
如果我将它们从'includes'中取出,则setup.py构建完成,但是当我打开应用程序时,我得到同样的错误.
我查看了各种cx_freeze模块导入问题,但似乎没有人处理过这个特定的场景.
我的实际setup.py:
# -*- coding: utf-8 -*-
import sys
from cx_Freeze import setup, Executable
base = None
if sys.platform == 'win32':
base = 'Win32GUI'
options = {
'build_exe': {
'includes': ['atexit', 'PrairieAnalysis', 'EphysTools'],
}
}
executables = [ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用转义字符创建一个简单的提示来定义提示组件的颜色:
PROMPT=$'\e[0;35m%n\e[0m \e[0;92m%~\e[0m \e[0;97m$ \e[0m'
Run Code Online (Sandbox Code Playgroud)
这工作正常,除了一件事 - 当我去选项卡完成时,我的光标(以及要完成的相关命令)向右移动。
一点谷歌搜索把我带到这里:https : //github.com/robbyrussell/oh-my-zsh/issues/23
将提示格式更改为类似:
PROMPT='%{$fg[green]%}%n%'
Run Code Online (Sandbox Code Playgroud)
解决问题。但是,与使用转义字符和上面显示的颜色代码相比,绿色、品红色、蓝色等颜色选项在您可以选择的颜色方面受到更多限制。
我无法弄清楚如何格式化上面显示的第一个提示,以便选项卡完成问题消失。关于 %{ 的位置,我尝试了一些不同的排列,但它们最终都破坏了提示字符串。
格式化这个的正确方法是什么?或者,有没有办法使用该$fg[COLOR]方案访问比红色、蓝色、洋红色等更多的颜色?
我正在尝试拟合通常由以下内容建模的数据:
def fit_eq(x, a, b, c, d, e):
return a*(1-np.exp(-x/b))*(c*np.exp(-x/d)) + e
x = np.arange(0, 100, 0.001)
y = fit_eq(x, 1, 1, -1, 10, 0)
plt.plot(x, y, 'b')
Run Code Online (Sandbox Code Playgroud)
但是,实际跟踪的示例要嘈杂得多:
如果我分别拟合上升和下降的分量,我可以得出一些合适的拟合:
def fit_decay(df, peak_ix):
fit_sub = df.loc[peak_ix:]
guess = np.array([-1, 1e-3, 0])
x_zeroed = fit_sub.time - fit_sub.time.values[0]
def exp_decay(x, a, b, c):
return a*np.exp(-x/b) + c
popt, pcov = curve_fit(exp_decay, x_zeroed, fit_sub.primary, guess)
fit = exp_decay(x_full_zeroed, *popt)
return x_zeroed, fit_sub.primary, fit
def fit_rise(df, peak_ix):
fit_sub = df.loc[:peak_ix]
guess = np.array([1, 1, …Run Code Online (Sandbox Code Playgroud) pyplot.scatter允许传递到c=与组相对应的数组,然后将根据这些组为点着色。但是,这似乎不支持不单独绘制每个组而生成图例。
因此,例如,可以通过遍历各组并分别绘制每个图来生成带有彩色组的散点图:
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
feats = load_iris()['data']
target = load_iris()['target']
f, ax = plt.subplots(1)
for i in np.unique(target):
mask = target == i
plt.scatter(feats[mask, 0], feats[mask, 1], label=i)
ax.legend()
Run Code Online (Sandbox Code Playgroud)
会产生:
我可以实现类似外观的情节而无需遍历每个组:
f, ax = plt.subplots(1)
ax.scatter(feats[:, 0], feats[:, 1], c=np.array(['C0', 'C1', 'C2'])[target])
Run Code Online (Sandbox Code Playgroud)
但是我无法找到第二种策略来生成相应图例的方法。我遇到的所有示例都在各个组之间进行迭代,这似乎不理想。我知道我可以手动生成图例,但这又显得太麻烦了。
我有 PowerPoint 文件,其中包含指向 Excel 文档中不同工作表的数十个链接。我需要以编程方式更改这些链接指向的 Excel 文档。
我很确定我可以使用 VBA 来完成此操作,但由于我无论如何都在 python 中生成 Excel 文档,所以我也更愿意更新那里的链接。
我深入研究了测试.pptx文件的底层 XML 文件,发现链接引用位于该ppt/slides/_rels/文件夹中(解压缩.pptx文件后)
例如,slide1.xml.rels包含多个关系,其中一个具有TargetMode="External"和Target="FULL_PATH_OMITTED\test.xlsx!Sheet1!R3C5:R20C14"
使用该python-ppt包我发现这个相同的引用位于slide.part.rels
例如:
for rel in slides[0].part.rels.values():
if rel.is_external:
print(rel.target_ref)
Run Code Online (Sandbox Code Playgroud)
找到链接的相同路径(即"FULL_PATH_OMITTED\test.xlsx!Sheet1!R3C5:R20C14")
我不知道如何更改这个值(如果可以更改的话)。只是尝试使用它来设置python-pptx它会产生一个AttributeError
有没有办法使用 来修改 PowerPoint 文件的底层 XML python-pptx?或者一些替代策略也可以。
我正在尝试创建一个允许用户选择多个目录的 QFileDialog。
遵循此处的讨论和此处的常见问题解答,但我不确定我做错了什么。我得到一个文件对话框,但它仍然只允许我选择一个目录(文件夹)。
这是在 Windows 7 上
代码:
class FileDialog(QtGui.QFileDialog):
def __init__(self, *args):
QtGui.QFileDialog.__init__(self, *args)
self.setOption(self.DontUseNativeDialog, True)
self.setFileMode(self.DirectoryOnly)
self.tree = self.findChild(QtGui.QTreeView)
self.tree.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
self.list = self.findChild(QtGui.QListView)
self.list.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
ex = FileDialog()
ex.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
编辑:
所以在玩了更多之后,如果我在文件对话框中选择“详细信息视图”,多选就可以了。但是,如果我选择“列表视图”,则它不起作用。知道为什么吗?
我使用了一段代码,类似于下面显示的虚拟代码块,根据时间序列数据集中缺失天数(即该特定属性ID没有数据的天数)的属性ID插入NaN值.
重新采样方法的改变pandas 0.18.0打破了这段代码,我无法弄清楚如何实现相同的行为.
码:
data = [['2010-01-01', 'A', 2], ['2010-01-02', 'A', 3], ['2010-01-05', 'A', 8],
['2010-01-10', 'A', 7], ['2010-01-13', 'A', 3], ['2010-01-01', 'B', 5],
['2010-01-03', 'B', 2], ['2010-01-04', 'B', 1], ['2010-01-11', 'B', 7],
['2010-01-14', 'B', 3]]
df = pd.DataFrame(data, columns=['Date', 'ID', 'Score'])
df.Date = pd.to_datetime(df.Date)
#Insert NA values on days where there is no data for each ID
df.sort_values(by=['Date', 'ID'], inplace=True)
df.set_index('Date').groupby('ID').resample('D').reset_index()
Run Code Online (Sandbox Code Playgroud)
现在运行这个AttributeError: Cannot access callable attribute 'reset_index' of 'DataFrameGroupBy' objects, try using the 'apply' method,当我查看新文档时,我理解为什么它不起作用. …
我们的数据输出文件夹包含可变数量的.csv文件,这些文件与包含所有不同记录参数的.xml文件相关联.每个.csv文件代表记录数据的"扫描",所以我目前正试图弄清楚如何将所有这些文件组合成一个大的多索引(扫描#和时间)数据帧进行处理(因为我们通常在看一次扫描一整套并找到平均值).
到目前为止,我有以下两个功能.第一个只是对数据框进行了一些小修改,使其在未来的路上更易于管理.
def import_pcsv(filename):
df = pd.read_csv(filename, skipinitialspace=True)
df.rename(columns = {df.columns[0]:'Time'}, inplace=True)
df.Time = df.Time/1000
df.set_index('Time', inplace=True)
return df
Run Code Online (Sandbox Code Playgroud)
第二个是解析文件夹的真正主力.它抓取文件夹中的所有xml文件,解析它们(使用我在另一个模块中放在一起的另一个函数),然后将关联的csv文件导入到一个大型数据框中.
def import_pfolder(folder):
vr_xmls = glob(folder+r'\*VoltageRecording*.xml')
data = pd.DataFrame()
counter = 1
for file in vr_xmls:
file_vals = pxml.parse_vr(file)
df = import_pcsv(folder + '\\' + file_vals['voltage recording'] + '.csv')
df['Sweep'] = 'Sweep' + str(counter)
df.set_index('Sweep', append=True, inplace=True)
data = data.append(df.reorder_levels(['Sweep','Time']))
counter+=1
return data
Run Code Online (Sandbox Code Playgroud)
问题是如果文件夹中有大量文件,这会变得非常慢.第一个函数基本上和普通的pandas read_csv函数一样快(它慢了几毫秒,但没关系)
我在文件夹中为不同数量的csv/xml文件对运行了一些计时测试.每个的%时间是:
1个文件= 339毫秒
5个文件= 2.61秒
10个文件= 7.53秒
20个文件= 24.7秒
40个文件= 87秒
最后一个是真正的杀手.
在试图解决这个问题时,我还在import_pfolder()中的for循环的每一行上获得了一些时间统计数据 - 括号中的时间是来自%timeit的最佳时间
第1行= …
我正在使用 PyQt 和 PyQtGraph 来构建一个相对简单的绘图 UI。作为其中的一部分,我有一个图形视图(pyqtgraph 的 graphicslayoutwidget),其中包含由用户动态添加的 PlotItem。
我想要实现的是允许用户通过双击它来选择一个 PlotItem。
如果用户在小部件窗口中的某处双击,这很简单,但我似乎无法弄清楚如何返回点击的内容。
我的大多数搜索结果都试图为某些按钮重新实现 mousePressEvent。我已经阅读了一些关于事件过滤器的内容,但我不确定这是否是必要的解决方案。
我不确定还有哪些其他信息可能有助于回答这个问题,所以如果不清楚我要问什么,请告诉我,以便我进行澄清。
编辑:
复制本:
python ×12
matplotlib ×3
pandas ×3
pyqt ×3
append ×1
colors ×1
cx-freeze ×1
dataframe ×1
datetime ×1
figure ×1
importerror ×1
legend ×1
performance ×1
powerpoint ×1
prompt ×1
py2exe ×1
pyqt4 ×1
pyqt5 ×1
pyqtgraph ×1
python-pptx ×1
qfiledialog ×1
qmouseevent ×1
qt ×1
qt-signals ×1
qtreeview ×1
qtreewidget ×1
scatter ×1
scipy ×1
subplot ×1
time-series ×1
zsh ×1