如何使用 Python 绘制能量排名图?
How do I plot an energy ranking figure using Python?
这是一些已发表论文中使用的典型能量排名,我正在努力使用 Python(任何 matplotlib、sns 等)为我的数据重现一个。我的数据构建在 Pandas 数据框中,如下所示:
System Color_id Data1 Data2
Form I 1 0.0 0.6
Form II 2 0.8 0.0
Form III 3 2.1 2.7
Form IV 4 2.2 0.3
Form V 5 1.7 1.2
我添加了“Color_id”列以启用 specific_column_values 着色,就像在 matplotlib 中一样,我想我只使用了 plt.scatter。我最挣扎的是绘制细长线而不是典型标记,以及如何自动连接跨不同数据的相似系统之间的虚线?非常感谢任何帮助或建议。
我实施了我在评论中建议的示例。这不会自动缩放坐标轴(我对其进行硬编码),或添加刻度标签,但这些都是您应该能够在其他问题上找到的东西。
import matplotlib.pyplot as plt
import numpy as np
def energy_rank(data, marker_width=.5, color='blue'):
y_data = np.repeat(data, 2)
x_data = np.empty_like(y_data)
x_data[0::2] = np.arange(1, len(data)+1) - (marker_width/2)
x_data[1::2] = np.arange(1, len(data)+1) + (marker_width/2)
lines = []
lines.append(plt.Line2D(x_data, y_data, lw=1, linestyle='dashed', color=color))
for x in range(0,len(data)*2, 2):
lines.append(plt.Line2D(x_data[x:x+2], y_data[x:x+2], lw=2, linestyle='solid', color=color))
return lines
data = np.random.rand(4,8) * 4 # 4 lines with 8 datapoints from 0 - 4
artists = []
for row, color in zip(data, ('red','blue','green','magenta')):
artists.extend(energy_rank(row, color=color))
fig, ax = plt.subplots()
for artist in artists:
ax.add_artist(artist)
ax.set_ybound([0,4])
ax.set_xbound([.5,8.5])
我不确定这在技术上是否是这个问题的答案,但我开发了一个基于 tkinter 的 Python 应用程序来以直接的方式绘制这些图表。
我认为它可能有用,请查看:
https://github.com/ricalmang/mechaSVG
用户界面如下所示:
典型的输出图如下所示:
技术说明:
在引擎盖下,相应 SVG 代码的程序生成(逐个元素生成)用于图形准备。其中大部分是通过名为 SvgGenEsp 的 class 完成的,这里不会详细介绍,因为它太长(300 多行代码)。
这是一些已发表论文中使用的典型能量排名,我正在努力使用 Python(任何 matplotlib、sns 等)为我的数据重现一个。我的数据构建在 Pandas 数据框中,如下所示:
System Color_id Data1 Data2
Form I 1 0.0 0.6
Form II 2 0.8 0.0
Form III 3 2.1 2.7
Form IV 4 2.2 0.3
Form V 5 1.7 1.2
我添加了“Color_id”列以启用 specific_column_values 着色,就像在 matplotlib 中一样,我想我只使用了 plt.scatter。我最挣扎的是绘制细长线而不是典型标记,以及如何自动连接跨不同数据的相似系统之间的虚线?非常感谢任何帮助或建议。
我实施了我在评论中建议的示例。这不会自动缩放坐标轴(我对其进行硬编码),或添加刻度标签,但这些都是您应该能够在其他问题上找到的东西。
import matplotlib.pyplot as plt
import numpy as np
def energy_rank(data, marker_width=.5, color='blue'):
y_data = np.repeat(data, 2)
x_data = np.empty_like(y_data)
x_data[0::2] = np.arange(1, len(data)+1) - (marker_width/2)
x_data[1::2] = np.arange(1, len(data)+1) + (marker_width/2)
lines = []
lines.append(plt.Line2D(x_data, y_data, lw=1, linestyle='dashed', color=color))
for x in range(0,len(data)*2, 2):
lines.append(plt.Line2D(x_data[x:x+2], y_data[x:x+2], lw=2, linestyle='solid', color=color))
return lines
data = np.random.rand(4,8) * 4 # 4 lines with 8 datapoints from 0 - 4
artists = []
for row, color in zip(data, ('red','blue','green','magenta')):
artists.extend(energy_rank(row, color=color))
fig, ax = plt.subplots()
for artist in artists:
ax.add_artist(artist)
ax.set_ybound([0,4])
ax.set_xbound([.5,8.5])
我不确定这在技术上是否是这个问题的答案,但我开发了一个基于 tkinter 的 Python 应用程序来以直接的方式绘制这些图表。
我认为它可能有用,请查看:
https://github.com/ricalmang/mechaSVG
用户界面如下所示:
典型的输出图如下所示:
技术说明:
在引擎盖下,相应 SVG 代码的程序生成(逐个元素生成)用于图形准备。其中大部分是通过名为 SvgGenEsp 的 class 完成的,这里不会详细介绍,因为它太长(300 多行代码)。