Выпуск тепловой карты в mapplotlib - PullRequest
0 голосов
/ 08 марта 2020

У меня есть тестовый файл с небольшим подмножеством данных, с которыми я работаю. Этот конкретный файл 25k строк с 3 столбцами. Положение X, положение Y и энергия депонированы. Я работаю над тем, чтобы получить тепловую карту, соответствующую разным интенсивностям выделенной энергии. Я чрезвычайно новичок во всех типах компьютерных работ, так что это немного пугает ...

%matplotlib inline
import pandas as pd
import numpy as np
import seaborn as sns

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
AT = "./Analysis.Test.csv"
df = pd.read_csv(AT, sep = ',', names=['Name','TrackID','ParentID','xPos','yPos','zPos','eDep','DeltaE','Einit','EventID'],low_memory=False,error_bad_lines=False)
df["xPos"] = df["xPos"].str.replace("(","")
df["zPos"] = df["zPos"].str.replace(")","")

df.sort_values(by='Name', ascending=[False])
df.dropna(how='any',axis=0,subset=['Name','TrackID','ParentID','xPos','yPos','zPos','eDep','DeltaE','Einit','EventID'], inplace=True)
couple_columns=df[['xPos','yPos','eDep']]
phase_1_2 = couple_columns.groupby(['xPos', 'yPos'])
phase_1_2.head(10)


major_ticks = np.arange(-200, 200, 20)                                              
minor_ticks = np.arange(-200, 200, 5)  

fig = plt.figure(figsize = (6,5))  
ax = fig.add_subplot(1,1,1) 
s = ax.scatter('xPos', 'yPos', c = 'eDep',data = phase_1_2, cmap = 'Blues_r', marker = 's',s = 190)
ax.axis([phase_1_2['xPos'].min()-10, phase_1_2['xPos'].max()+10, phase_1_2['yPos'].min()-10, phase_1_2['yPos'].max()+10])
ax.set_xticks(major_ticks)                                                       
ax.set_xticks(minor_ticks, minor=True)                                           
ax.set_yticks(major_ticks)                                                                                                                                                      
ax.grid(which='both', alpha = 0.3)                                                                                                           
ax.grid(which='major', alpha=0.3) 
ax.set_xlabel('x position', fontsize=10);
ax.set_ylabel('y position', fontsize=10);
ax.set_title('Energy from Betas', size = 15)

cbar = plt.colorbar(mappable = s,ax = ax)

plt.show()

, что выдает мне следующее сообщение об ошибке:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in _parse_scatter_color_args(c, edgecolors, kwargs, xshape, yshape, get_next_color_func)
   4284             try:  # Then is 'c' acceptable as PathCollection facecolors?
-> 4285                 colors = mcolors.to_rgba_array(c)
   4286                 n_elem = colors.shape[0]

~\Anaconda3\lib\site-packages\matplotlib\colors.py in to_rgba_array(c, alpha)
    293     for i, cc in enumerate(c):
--> 294         result[i] = to_rgba(cc, alpha)
    295     return result

~\Anaconda3\lib\site-packages\matplotlib\colors.py in to_rgba(c, alpha)
    176     if rgba is None:  # Suppress exception chaining of cache lookup failure.
--> 177         rgba = _to_rgba_no_colorcycle(c, alpha)
    178         try:

~\Anaconda3\lib\site-packages\matplotlib\colors.py in _to_rgba_no_colorcycle(c, alpha)
    239         # Test dimensionality to reject single floats.
--> 240         raise ValueError("Invalid RGBA argument: {!r}".format(orig_c))
    241     # Return a tuple to prevent the cached value from being modified.

ValueError: Invalid RGBA argument: (('-0.0101072', -7.0427), 11227    0.067631
Name: eDep, dtype: float64)

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-10-3ff2dded4a5c> in <module>
     16 fig = plt.figure(figsize = (6,5))
     17 ax = fig.add_subplot(1,1,1)
---> 18 s = ax.scatter('xPos', 'yPos', c = 'eDep',data = phase_1_2, cmap = 'Blues_r', marker = 's',s = 190)
     19 ax.axis([phase_1_2['xPos'].min()-10, phase_1_2['xPos'].max()+10, phase_1_2['yPos'].min()-10, phase_1_2['yPos'].max()+10])
     20 ax.set_xticks(major_ticks)

~\Anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, data, *args, **kwargs)
   1637                 bound.arguments.setdefault(varkwargs_name, {})["label"] = label
   1638 
-> 1639         return func(*bound.args, **bound.kwargs)
   1640 
   1641     inner.__doc__ = _add_data_doc(inner.__doc__, replace_names)

~\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, plotnonfinite, **kwargs)
   4452             self._parse_scatter_color_args(
   4453                 c, edgecolors, kwargs, xshape, yshape,
-> 4454                 get_next_color_func=self._get_patches_for_fill.get_next_color)
   4455 
   4456         if plotnonfinite and colors is None:

~\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in _parse_scatter_color_args(c, edgecolors, kwargs, xshape, yshape, get_next_color_func)
   4304                         "'c' argument must be a mpl color, a sequence of mpl "
   4305                         "colors or a sequence of numbers, not {}."
-> 4306                             .format(c)  # note: could be long depending on c
   4307                     )
   4308         else:

ValueError: 'c' argument must be a mpl color, a sequence of mpl colors or a sequence of numbers, not <pandas.core.groupby.generic.SeriesGroupBy object at 0x0000026797125808>.

Любая помощь очень ценится! Я также попробовал Seaborn, но когда я развернул свой набор данных, он дал мне несколько значений NaN.

1 Ответ

0 голосов
/ 08 марта 2020

Итак, судя по всему, проблема заключается в формате данных, которые вы здесь группируете:

phase_1_2 = couple_columns.groupby(['xPos', 'yPos'])

, но в действительности вы ничего не делаете с eDep. Изменение на:

phase_1_2 = couple_columns.groupby(['xPos', 'yPos']).sum()

даст вам sum столбца eDep, и, поскольку вы группируете по xPos и yPos, pandas знает, как использовать их для группировки.

Подробнее о pandas groupBys можно прочитать здесь: https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html

...