DingWB/PyComplexHeatmap

'DataFrame' object has no attribute 'C'

Closed this issue · 4 comments

I'm working my way through the examples, and when I get to the dotHeatmap example Add parameter hue and use different cmap and marker for different groups:

plt.figure(figsize=(8,8))
cm = DotClustermapPlotter(corr_mat,x='level_0',y='level_1',value='correlation',hue='Level',
              cmap={'High':'Reds','Middle':'Purples','Low':'Greens'},
              colors={'High':'red','Middle':'purple','Low':'green'},
              marker={'High':'P','Middle':'*','Low':'D'},spines=True,
              vmax=1,vmin=0)
plt.show()

I get the following output:

/root/miniforge3/lib/python3.10/site-packages/PyComplexHeatmap/dotHeatmap.py:362: FutureWarning: The provided callable <function mean at 0x7f1dc05ab880> is currently using DataFrameGroupBy.mean. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "mean" instead.
  data2d = data.pivot_table(
Starting plotting..
Starting calculating row orders..
Reordering rows..
Starting calculating col orders..
Reordering cols..
Plotting matrix..
Inferred max_s (max size of scatter point) is: 132.808800071564

And the following error:

AttributeError                            Traceback (most recent call last)
/tmp/ipykernel_13878/1321454167.py in ?()
      1 plt.figure(figsize=(8,8))
----> 2 cm = pch.DotClustermapPlotter(corr_mat,x='level_0',y='level_1',value='correlation',hue='Level',
      3               cmap={'High':'Reds','Middle':'Purples','Low':'Greens'},
      4               colors={'High':'red','Middle':'purple','Low':'green'},
      5               marker={'High':'P','Middle':'*','Low':'D'},spines=True,

~/miniforge3/lib/python3.10/site-packages/PyComplexHeatmap/dotHeatmap.py in ?(self, data, x, y, value, hue, s, c, marker, alpha, color_legend_kws, cmap_legend_kws, dot_legend_kws, dot_legend_marker, aggfunc, value_na, hue_na, s_na, c_na, x_order, y_order, spines, grid, max_s, **kwargs)
    354                 self.dot_legend_kws = dot_legend_kws
    355                 self.dot_legend_marker=dot_legend_marker
    356                 self.max_s=max_s
    357 
--> 358                 super().__init__(**kwargs)

~/miniforge3/lib/python3.10/site-packages/PyComplexHeatmap/clustermap.py in ?(self, data, z_score, standard_scale, top_annotation, bottom_annotation, left_annotation, right_annotation, row_cluster, col_cluster, row_cluster_method, row_cluster_metric, col_cluster_method, col_cluster_metric, show_rownames, show_colnames, row_names_side, col_names_side, xticklabels_kws, yticklabels_kws, row_dendrogram, col_dendrogram, row_dendrogram_size, col_dendrogram_size, row_split, col_split, row_dendrogram_kws, col_dendrogram_kws, tree_kws, row_split_order, col_split_order, row_split_gap, col_split_gap, mask, subplot_gap, legend, legend_kws, plot, plot_legend, legend_anchor, legend_gap, legend_width, legend_hpad, legend_vpad, legend_side, cmap, label, xlabel, ylabel, xlabel_kws, ylabel_kws, xlabel_side, ylabel_side, xlabel_bbox_kws, ylabel_bbox_kws, rasterized, legend_delta_x, verbose, **kwargs)
   1282                 self.ylabel_side = ylabel_side
   1283                 self.xlabel_bbox_kws = xlabel_bbox_kws
   1284                 self.ylabel_bbox_kws = ylabel_bbox_kws
   1285                 if plot:
-> 1286                         self.plot()
   1287                         if plot_legend:
   1288                                 if legend_anchor == "auto":
   1289 					if (

~/miniforge3/lib/python3.10/site-packages/PyComplexHeatmap/clustermap.py in ?(self, ax, subplot_spec, row_order, col_order)
   2296                         if self.verbose >= 1:
   2297                                 print("Starting calculating col orders..")
   2298                         self._reorder_cols()
   2299                         col_order = self.col_order
-> 2300                 self.plot_matrix(row_order=row_order, col_order=col_order)
   2301                 if not self.top_annotation is None:
   2302                         gs = self.gs[0, 1] if not self.col_dendrogram else self.top_gs[1, 0]
   2303                         self.top_annotation._set_orentation("up")

~/miniforge3/lib/python3.10/site-packages/PyComplexHeatmap/dotHeatmap.py in ?(self, row_order, col_order)
    522                                 # ax1.set_xlim([0, len(rows)])
    523                                 # ax1.set_ylim([0, len(cols)])
    524                                 kwargs = self.kwargs.copy()
    525                                 # print(kwargs)
--> 526 				dotHeatmap2d(
    527                                         self.data2d.loc[rows, cols],
    528                                         cmap=kwargs.pop("cmap", self.cmap),
    529                                         ax=ax1,

~/miniforge3/lib/python3.10/site-packages/PyComplexHeatmap/dotHeatmap.py in ?(***failed resolving arguments***)
    205 				ax.scatter(
    206                                         x=df2.X.values,
    207                                         y=df2.Y.values,
    208                                         s=df2.S * max_s,
--> 209                                         c=df2.C.values,
    210                                         **kwargs
    211 				)  #
    212         else:

~/miniforge3/lib/python3.10/site-packages/pandas/core/generic.py in ?(self, name)
   6295             and name not in self._accessors
   6296             and self._info_axis._can_hold_identifiers_and_holds_name(name)
   6297         ):
   6298             return self[name]
-> 6299         return object.__getattribute__(self, name)

AttributeError: 'DataFrame' object has no attribute 'C'

Desktop:

  • OS: Windows 11 running WSL2 Ubuntu
    • Operating System: Ubuntu 22.04.4 LTS
    • Kernel: Linux 5.15.153.1-microsoft-standard-WSL2
    • Architecture: x86-64

Python versions installed:

  • pycomplexheatmap : 1.7.6.dev0+ge0b350a.d20240801
  • matplotlib : 3.7.5
  • pandas : 2.2.2
    Full list: python_list.txt

Hi @medmaca ,
Sorry for this bug.
I have already fixed this bug, could you please uninstall and reinstall from GitHub and test it again?
pip uninstall -y PyComplexHeatmap && pip install git+https://github.com/DingWB/PyComplexHeatmap
Please let me know whether it works or not; I will release a new version if there is no problem.

I have already released a new version (1.7.6).
Please let me know whether there is any issue with this release. @medmaca

Hi, thank you so much for such a quick reply and fix. I've now downloaded the latest version and it fixes that example code.

However, I am slightly confused by the merit of that example.

The website example (altered for colour blind, i.e. me):
plt.figure(figsize=(8,8)) cm = pch.DotClustermapPlotter(corr_mat,x='level_0',y='level_1',value='correlation',hue='Level', # cmap={'High':'Reds','Middle':'Purples','Low':'Greens'}, # colors={'High':'red','Middle':'purple','Low':'green'}, cmap={'High':'Reds','Middle':'Oranges','Low':'Blues'}, colors={'High':'red','Middle':'orange','Low':'blue'}, marker={'High':'P','Middle':'*','Low':'D'},spines=True, vmax=1,vmin=0) plt.show()
image

My altered version of the same example:
`plt.figure(figsize=(8,8))
cm = pch.DotClustermapPlotter(corr_mat,x='level_0',y='level_1',value='correlation',hue='Level',
s='correlation',c='correlation',
cmap={'High':'Reds','Middle':'Oranges','Low':'Blues'},
colors={'High':'red','Middle':'orange','Low':'blue'},
marker={'High':'P','Middle':'*','Low':'D'},spines=True,
vmax=1,vmin=-1, grid=None)

plt.show()`

image

The example on the website I find really confusing as the largest diamonds are really the lowest correlations, this makes it really hard to interpret the plot. Am I missing something obvious?

Thanks again for all the hard work you've put into this marvelous package.

Sorry for the inconvenience.
I have been trying to make it simpler, but you know, there are too many parameters.
Please let me know if you have any better ideas.