Python を使うための環境を整備しておく必要があります。いろいろな環境があると思いますが、今回は macOS と Windows でそれぞれ一例を挙げておきます。
1. macOSの環境
ターミナルを使います。

ターミナルを起動し、コマンドを打ち込んでいきます。

まず、以下のコマンドを打ってみました。最初は Python 3.9.6 と表示されました。
python3 --version
1.1 パッケージマネージャー Homebrew のインストール
Version 3.9.6 は Gemini によるとシステムでも使っているので、仮想環境を作って最新のバージョンをインストールした方が良いとのことでした。それでまずインストールの準備としてパッケージマネージャー Homebrew をインストールしました。途中パスワードを聞いてくるので、macOSへログインするときのパスワードを入力しました。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
1.2 Python のインストール
Homebrew がインストールできたら、以下のように Python をインストールします。
brew install python
インストール後、バージョンを確認します。今度は Python 3.14.2 と表示されました。
python3 --version

1.3 フォルダと仮想環境の作成
Python がインストールできたらプログラムを置くフォルダを作成し、そのフォルダ内に仮想環境を作成します。仮想環境を作ることで安全に Python プログラムの開発ができます。
mkdir py
cd py
python3 -m venv .venv
1.4 プログラムの作成と実行
今回は note の記事「Pythonで1✕1キューブの持ち替えグラフ」で最終的に作成したプログラム:
# 1x1キューブの状態遷移グラフの作成
# Version 0.1.2
# Copyright © 2025 Nonki Takahashi. The MIT License.
import networkx as nx
import matplotlib.pyplot as plt
# --- 1. 定義 ---
# 標準的なルービックキューブの配色と反対色の定義
# U(白) vs D(黄), F(赤) vs B(橙), R(青) vs L(緑)
OPPOSITES = {
'W': 'Y', 'Y': 'W', # White vs Yellow
'G': 'B', 'B': 'G', # Green vs Blue
'R': 'O', 'O': 'R' # Red vs Orange
}
def get_opposite_color(color):
"""指定された色と反対の色を返す"""
return OPPOSITES.get(color, None)
# U面とF面に対応するR面を定義
def get_r_color(u_color, f_color):
"""U面とF面の色からR面の色を決定する"""
corners = ['WRB', 'WBO', 'WOG', 'WGR', 'YRG', 'YGO', 'YOB', 'YBR']
for corner in corners:
u_pos = corner.find(u_color)
f_pos = corner.find(f_color)
f_minus_u = f_pos - u_pos
if u_pos >= 0 and f_pos >= 0 and f_minus_u in [1, -2]:
r_pos = f_pos + 1
if (r_pos > 2):
r_pos = 0
return corner[r_pos]
# 標準的な隣接関係の定義 (F=赤, U=白 を基準)
# どの面が隣接しているか、そして特定の操作でどのように回転するかを定義
# (Front, Up) の状態に操作を適用した後の新しい (Front, Up) を返す関数
def apply_operation(state_str, operation):
"""
現在の状態 (FU形式: 例 'GW') と操作 ('R', 'U', 'F') から、新しい状態を計算する。
state_str = F + U (例: 'RW' -> Front=Red, Up=White)
"""
F, U = state_str[0], state_str[1]
B = get_opposite_color(F)
D = get_opposite_color(U)
R = get_r_color(F, U)
L = get_opposite_color(R)
# 抽象的な色の定義 (W, Y, R, O, B, G) を具体的な軸回転に対応させる
# U操作 (Y軸周り90度): F -> R, R -> B, B -> L, L -> F
if operation == 'U':
return f'{L}{U}'
# R操作 (X軸周り90度): U -> B, B -> D, D -> F, F -> U
elif operation == 'R':
return f'{D}{F}'
# F操作 (Z軸周り90度): U -> R, R -> D, D -> L, L -> U
elif operation == 'F':
return f'{F}{L}'
return None
# --- 2. グラフ構築 ---
G = nx.DiGraph()
all_colors = ['W', 'Y', 'R', 'O', 'B', 'G']
nodes = []
# 24通りの状態(ノード)の生成
for F in all_colors:
for U in all_colors:
if (U != F) and (U != get_opposite_color(F)):
nodes.append(f'{F}{U}')
G.add_nodes_from(nodes)
# すべてのエッジ(操作)の追加ロジック
operations = ['U', 'R', 'F'] # U, R, F 操作を定義
# 24個のノードから始まるエッジをすべて追加
for start_node in nodes:
for op in operations:
end_node = apply_operation(start_node, op)
if end_node:
G.add_edge(start_node, end_node, operation=op)
# --- 3. シェルレイアウト用のノードグループ化 ---
# 3つのシェルを定義。各シェルはU面(上面)の色でグループ化される。
# 例: 'W'シェルは上面が白と黄の8つの状態を含む。
shells = []
for U_color in all_colors:
shell = [node for node in G.nodes() if (node[1] == U_color) or (node[1] == get_opposite_color(U_color))]
# ノードが8つ存在することを確認
if len(shell) == 8:
shells.append(shell)
# 24通りの状態が生成できていれば、shellsには3つのリスト(各8ノード)が入る。
# --- 4. グラフの可視化(レイアウトの変更) ---
# スプリングレイアウトはノードを分散させ、クラスターを見つけやすくする
# グラフの構築部分(24ノードの生成)はそのまま使用
plt.figure(figsize=(12, 12))
# shell_layoutを使用し、ノードを3つの同心円状の層に配置
pos = nx.shell_layout(G, nlist=shells)
# ノードの描画 (ここではU面の色でノードを着色)
node_color_map = {'W': 'white', 'Y': 'yellow', 'R': 'red', 'O': 'orange', 'G': 'lime', 'B': 'cyan'}
node_colors = [node_color_map[node[1]] for node in G.nodes()]
nx.draw_networkx_nodes(G, pos, node_size=800, node_color=node_colors, edgecolors='black')
# エッジの描画 (操作ごとに色を変える)
# U操作 (白), R操作 (青), F操作 (赤)
edge_colors = []
for u, v, data in G.edges(data=True):
op = data.get('operation')
if op == 'U':
edge_colors.append('lightgray')
elif op == 'R':
edge_colors.append('blue')
elif op == 'F':
edge_colors.append('red')
else:
edge_colors.append('gray')
nx.draw_networkx_edges(G, pos, edge_color=edge_colors, arrows=True, width=1.5)
nx.draw_networkx_labels(G, pos, font_size=8, font_color='black')
plt.title("1x1 Cube Transformation Graph (Partial D4 Structure for U-face)")
plt.axis('off')
plt.show()
をコピーして以下のように rubik-graph.py として保存し、実行しました。
pbpaste > rubik-graph.py
python3 rubik-graph.py
実行結果は以下のとおりです。

2. Windows の環境
PowerShell 7 (x64) を使います。

以下は PowerShell 7 (x64) のサンプル画面です。PowerShell の最新版があると、冒頭で教えてくれます。気になる方は最新版をインストールしてみてください。

2.1 Python のインストール
Windows の場合はパッケージマネージャーは使いません。Python を公式サイトからインストールします。
2.2 フォルダと仮想環境の作成
プログラム用のフォルダを作成し、そこに仮想環境を作成します。
md py
cd py
python -m venv .venv
2.3 プログラムの作成と実行
プログラムを macOS のときと同様にクリップボードからファイルに保存し、実行します。
Get-Clipboard | Out-File -FilePath rubik-graph.py -Encoding utf8BOM
python rubik-graph.py
実行結果は以下の通りです。


