Closed hw1804 closed 1 year ago
This is intriguing, I am not able to reproduce that error.
First of all, I am not sure why the number of clusters generated does not match (in my case I get 6 clusters), be sure to have updated scFates v1.0.4 and are using the latest tutorial, as I updated both of them lately.
If it still fails, can you run the following cell before the cell of pl.trends
causing the error:
import igraph
import numpy as np
graph=adata.uns["graph"]
dct = graph["milestones"]
keys = np.array(list(dct.keys()))
vals = np.array(list(dct.values()))
edges = graph["pp_seg"][["from", "to"]].astype(str).apply(tuple, axis=1).values
img = igraph.Graph(directed=True)
img.add_vertices(vals.astype(str))
img.add_edges(edges)
allpaths = img.get_all_shortest_paths(
str(graph["root"]), to=graph["tips"].astype(str)
)
allpaths = np.array(allpaths, dtype=object)[
np.argsort(np.array([len(p) for p in allpaths]))
]
order = allpaths[0]
for i in range(1, len(allpaths)):
order = order + np.array(allpaths[i])[~np.isin(allpaths[i], order)].tolist()
order = np.array(order)[1:]
print(order)
print(order.dtype)
What output do you see? In my case it is:
[0]
int64
I was running my own dataset using the tutorial, that's probably why it has got 9 clusters. I ran the test code, it gave [1] object instead of [0] int. One of my friend thinks it may be because of the python version I am using. I am using python 3.11.4. I am not sure why my python or notepad interact differently.
I just tried with python 3.11 and I am not getting any issue (and order
is numpy array with int64), this could be dataset related. Do you see the same error by reproducing exactly the example notebook?
I ran the tutorial with your dataset and was able to get the scf.pl.trends to work. I ran the same code again using my dataset and it still gave the same error. My dataset was originally a seurat object, and I converted it to h5ad file for python packages to read. Any pointers on how can I fix my dataset? I could plot a lot of graphs fine, just not the scf.pl.trends, which I really want to show for publication.
update: I can plot scf.pl.single_trend just fine. But scf.pl.trends not working. I have converted my seurat file to loom and still the same error. Here is what my dataset look like:
Could you try this code?
import igraph
import numpy as np
import pandas as pd
graph=adata.uns["graph"]
dct = graph["milestones"]
keys = np.array(list(dct.keys()))
vals = np.array(list(dct.values()))
edges = graph["pp_seg"][["from", "to"]].astype(str).apply(tuple, axis=1).values
img = igraph.Graph(directed=True)
img.add_vertices(vals.astype(str))
img.add_edges(edges)
allpaths = img.get_all_shortest_paths(
str(graph["root"]), to=graph["tips"].astype(str)
)
allpaths = np.array(allpaths, dtype=object)[
np.argsort(np.array([len(p) for p in allpaths]))
]
order = allpaths[0]
for i in range(1, len(allpaths)):
order = order + np.array(allpaths[i])[~np.isin(allpaths[i], order)].tolist()
order = np.array(order)[1:]
print(pd.Series(graph["milestones"].keys(), index=graph["milestones"].values())[
[np.array(img.vs["name"])[o].astype(int) for o in order]
])
If it succeed I will probably be able to change the part of the function that was causing the error, avoid the check for int or booleans
I think we are getting there! Now you try to use pl.trends
using that version of scFates:
pip install git+https://github.com/LouisFaure/scFates@v1.0.5dev
Thank you so much for your help. The pl.trends works now for my dataset as well with the dev version.
Great! I have now included the changes to v1.0.5
Hi, I was trying to plot a series of graph using scf.pl.trends and I have done other procedures in the basic curved trajectory analysis tutorial "fitting&clustering significant features" part. I am using the tutorial code and it gave the error in the screenshot: "arrays used as indices must be of integer (or boolean) type". Is there any work-around of this issue?