热图不包括每行中的第一个非NaN记录。

huangapple go评论106阅读模式
英文:

heatmap excluding first non-NaN record in each row

问题

我正在使用seaborn构建热力图。我需要热力图从每行的第二个值开始。而且这个第二个值不是固定的列。如何实现这一点。这是我正在使用的代码:

  1. fig, ax = plt.subplots(figsize=(15, 15))
  2. sns.set(font_scale=0.7)
  3. map1 = sns.heatmap(ax=ax, data=clv, annot=True, fmt='0.2f', cmap='Blues', linecolor='Grey', linewidth=.5, cbar=False)
  4. st.write(fig)

我需要在每一行上显示热力图,但不包括每行的第一个值,这个值不是固定的。

这是示例数据:

  1. Column A B C D E F G H I J K L M N
  2. A 2.19 1.12 1.06 1.24 0.89 0.93 0.71 0.97 0.61 0.68 0.72 0.55 0.59 0.58
  3. B 31.05 9.31 16.48 10.77 11.60 8.43 12.33 7.89 8.49 8.61 6.95 7.23 6.97
  4. C 50.34 17.34 19.69 15.70 13.50 16.95 12.51 12.12 12.12 9.83 10.48 9.56
  5. D 124.00 25.07 40.78 32.21 44.23 29.97 30.92 28.58 23.77 24.71 22.80
  6. E 182.82 28.25 51.04 62.91 47.92 43.83 41.84 33.66 35.66 31.94
  7. F 207.76 26.22 68.38 50.90 51.71 43.71 37.00 37.97 34.58
  8. G 216.92 32.33 53.02 47.19 42.77 32.44 34.16 30.33
  9. H 250.60 27.36 47.94 46.47 37.61 35.55 33.62
  10. I 223.64 19.83 35.02 31.58 33.43 28.96
  11. J 213.82 17.22 28.91 34.00 31.92
  12. K 201.36 13.90 28.63 29.06
  13. L 163.07 13.71 22.24
  14. M 177.52 11.58
  15. N 1701.76

这是数据的外观:

这是目前的外观。热力图是对角线生成的,而不是在每行中生成的。

英文:

I am building heat map using seaborn. I need heatmap to start from the second value in each row. And this second value is not a fixed column. How to achieve that. This is the code I am using:

  1. fig, ax = plt.subplots(figsize=(15, 15))
  2. sns.set(font_scale=0.7)
  3. map1=sns.heatmap(ax = ax, data = clv, annot = True, fmt='0.2f', cmap = 'Blues',linecolor='Grey',linewidth=.5, cbar=False)
  4. st.write(fig)

I need heatmap on each row, but excluding the first value in each row which is not fixed.

热图不包括每行中的第一个非NaN记录。

This is sample data:

  1. Column A B C D E F G H I J K L M N
  2. A 2.19 1.12 1.06 1.24 0.89 0.93 0.71 0.97 0.61 0.68 0.72 0.55 0.59 0.58
  3. B 31.05 9.31 16.48 10.77 11.60 8.43 12.33 7.89 8.49 8.61 6.95 7.23 6.97
  4. C 50.34 17.34 19.69 15.70 13.50 16.95 12.51 12.12 12.12 9.83 10.48 9.56
  5. D 124.00 25.07 40.78 32.21 44.23 29.97 30.92 28.58 23.77 24.71 22.80
  6. E 182.82 28.25 51.04 62.91 47.92 43.83 41.84 33.66 35.66 31.94
  7. F 207.76 26.22 68.38 50.90 51.71 43.71 37.00 37.97 34.58
  8. G 216.92 32.33 53.02 47.19 42.77 32.44 34.16 30.33
  9. H 250.60 27.36 47.94 46.47 37.61 35.55 33.62
  10. I 223.64 19.83 35.02 31.58 33.43 28.96
  11. J 213.82 17.22 28.91 34.00 31.92
  12. K 201.36 13.90 28.63 29.06
  13. L 163.07 13.71 22.24
  14. M 177.52 11.58
  15. N 1701.76

This is how data looks 热图不包括每行中的第一个非NaN记录。

This is how it's looking right now. Heatmap is generated diagonally not in each row.

热图不包括每行中的第一个非NaN记录。

答案1

得分: 2

我理解您想要对数据进行着色,而不考虑对角线部分。您可以为对角线创建一个掩码,然后在其上创建两个热力图。首先是一个只包含对角线的热力图,使用固定颜色(或者只是一个不同于主要热力图的颜色映射)。然后是其余部分的热力图。Seaborn将使掩码部分保持透明。

  1. from matplotlib import pyplot as plt
  2. import seaborn as sns
  3. import pandas as pd
  4. import numpy as np
  5. df = pd.DataFrame([[2.19, 1.12, 1.06, 1.24, 0.89, 0.93, 0.71, 0.97, 0.61, 0.68, 0.72, 0.55, 0.59, 0.58],
  6. [np.nan, 31.05, 9.31, 16.48, 10.77, 11.6, 8.43, 12.33, 7.89, 8.49, 8.61, 6.95, 7.23, 6.97],
  7. [np.nan, np.nan, 50.34, 17.34, 19.69, 15.7, 13.5, 16.95, 12.51, 12.12, 12.12, 9.83, 10.48, 9.56],
  8. [np.nan, np.nan, np.nan, 124.0, 25.07, 40.78, 32.21, 44.23, 29.97, 30.92, 28.58, 23.77, 24.71, 22.8],
  9. [np.nan, np.nan, np.nan, np.nan, 182.82, 28.25, 51.04, 62.91, 47.92, 43.83, 41.84, 33.66, 35.66, 31.94],
  10. [np.nan, np.nan, np.nan, np.nan, np.nan, 207.76, 26.22, 68.38, 50.9, 51.71, 43.71, 37.0, 37.97, 34.58],
  11. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 216.92, 32.33, 53.02, 47.19, 42.77, 32.44, 34.16, 30.33],
  12. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 250.6, 27.36, 47.94, 46.47, 37.61, 35.55, 33.62],
  13. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 223.64, 19.83, 35.02, 31.58, 33.43, 28.96],
  14. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 213.82, 17.22, 28.91, 34.0, 31.92],
  15. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 201.36, 13.9, 28.63, 29.06],
  16. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 163.07, 13.71, 22.24],
  17. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 177.52, 11.58],
  18. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 1701.76]],
  19. columns=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N'],
  20. index=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N'])
  21. sns.set() # 设置默认的 Seaborn 样式
  22. fig, ax = plt.subplots(figsize=(20, 12))
  23. diagonal_mask = np.eye(len(df), dtype=bool) # 创建一个对角线为True的方形掩码矩阵
  24. cmap_for_diag = sns.color_palette(['aliceblue'], as_cmap=True) # 创建一个单色的对角线颜色映射
  25. common_keywords = dict(annot=True, fmt='.2f', linecolor='Grey', linewidth=0.5, ax=ax)
  26. # 创建对角线部分的热力图
  27. sns.heatmap(df, cmap=cmap_for_diag, mask=~diagonal_mask, cbar=False, **common_keywords)
  28. # 创建其余部分的热力图
  29. sns.heatmap(df, cmap='Spectral', mask=diagonal_mask, **common_keywords)
  30. plt.tight_layout()
  31. plt.show()

热图不包括每行中的第一个非NaN记录。

  1. <details>
  2. <summary>英文:</summary>
  3. If I understand correctly, you want to color your data without taking into account the diagonal. You can create a mask for the diagonal, and create two heatmaps on top of each other. First a heatmap with only the diagonal, with a fixed color (or just a different colormap as the main heatmap). Then a heatmap with the rest. Seaborn will leave the masked away parts transparent.
  4. ```python
  5. from matplotlib import pyplot as plt
  6. import seaborn as sns
  7. import pandas as pd
  8. import numpy as np
  9. df = pd.DataFrame([[2.19, 1.12, 1.06, 1.24, 0.89, 0.93, 0.71, 0.97, 0.61, 0.68, 0.72, 0.55, 0.59, 0.58],
  10. [np.nan, 31.05, 9.31, 16.48, 10.77, 11.6, 8.43, 12.33, 7.89, 8.49, 8.61, 6.95, 7.23, 6.97],
  11. [np.nan, np.nan, 50.34, 17.34, 19.69, 15.7, 13.5, 16.95, 12.51, 12.12, 12.12, 9.83, 10.48, 9.56],
  12. [np.nan, np.nan, np.nan, 124.0, 25.07, 40.78, 32.21, 44.23, 29.97, 30.92, 28.58, 23.77, 24.71, 22.8],
  13. [np.nan, np.nan, np.nan, np.nan, 182.82, 28.25, 51.04, 62.91, 47.92, 43.83, 41.84, 33.66, 35.66, 31.94],
  14. [np.nan, np.nan, np.nan, np.nan, np.nan, 207.76, 26.22, 68.38, 50.9, 51.71, 43.71, 37.0, 37.97, 34.58],
  15. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 216.92, 32.33, 53.02, 47.19, 42.77, 32.44, 34.16, 30.33],
  16. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 250.6, 27.36, 47.94, 46.47, 37.61, 35.55, 33.62],
  17. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 223.64, 19.83, 35.02, 31.58, 33.43, 28.96],
  18. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 213.82, 17.22, 28.91, 34.0, 31.92],
  19. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 201.36, 13.9, 28.63, 29.06],
  20. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 163.07, 13.71, 22.24],
  21. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 177.52, 11.58],
  22. [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 1701.76]],
  23. columns=[&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;, &#39;E&#39;, &#39;F&#39;, &#39;G&#39;, &#39;H&#39;, &#39;I&#39;, &#39;J&#39;, &#39;K&#39;, &#39;L&#39;, &#39;M&#39;, &#39;N&#39;],
  24. index=[&#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;, &#39;E&#39;, &#39;F&#39;, &#39;G&#39;, &#39;H&#39;, &#39;I&#39;, &#39;J&#39;, &#39;K&#39;, &#39;L&#39;, &#39;M&#39;, &#39;N&#39;])
  25. sns.set() # set default seaborn style
  26. fig, ax = plt.subplots(figsize=(20,12))
  27. diagonal_mask = np.eye(len(df), dtype=bool) # the mask is a square matrix with True on the diagonal
  28. cmap_for_diag = sns.color_palette([&#39;aliceblue&#39;], as_cmap=True) # create a one-colored colormap for the diagonal
  29. common_keywords = dict(annot=True, fmt=&#39;.2f&#39;, linecolor=&#39;Grey&#39;, linewidth=.5, ax=ax)
  30. # create a heatmap for the diagonal
  31. sns.heatmap(df, cmap=cmap_for_diag, mask=~diagonal_mask, cbar=False, **common_keywords)
  32. # create a heatmap for the rest of the data
  33. sns.heatmap(df, cmap=&#39;Spectral&#39;, mask=diagonal_mask, **common_keywords)
  34. plt.tight_layout()
  35. plt.show()

热图不包括每行中的第一个非NaN记录。

huangapple
  • 本文由 发表于 2023年3月7日 07:27:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/75656740.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定